LeetCode-1 Two Sum

来源:互联网 发布:阿里云客服一个月工资 编辑:程序博客网 时间:2024/05/22 11:42


本题,首先想到的是用蛮力法解决,也就是遍历两边数组,时间复杂度为O(n^2)

C++代码如下:

class Solution {public:    vector<int> twoSum(vector<int>& nums, int target) {        vector<int>::iterator begin,end;        int i,j;        for(i=0,begin=nums.begin();begin!=nums.end();begin++,i++)            for(j=i+1,end=begin+1;end!=nums.end();end++,j++)            {                if((*begin+*end == target))                    goto result;            }    result:        vector<int> returnVal;        returnVal.push_back(i);        returnVal.push_back(j);        return returnVal;    }};


但是在OJ上会超时,原因是时间复杂度太高了,因此可以采取空间换时间的方法,利用哈希散列达到目的。

JAVA代码如下:

public class Solution {    public int[] twoSum(int[] nums, int target) {        Map<Integer, Integer> map = new HashMap<>();        for (int i = 0; i < nums.length; i++) {            map.put(nums[i], i);                    }        for (int i = 0; i < nums.length; i++) {            int complement = target - nums[i];            if (map.containsKey(complement) && map.get(complement) != i) {                return new int[] { i, map.get(complement) };                            }                    }        throw new IllegalArgumentException("No two sum solution");    }}


另外还有一种做法是先对数组进行从小到大的排序(一般默认为快速排序)。然后从首尾同时开始遍历,若首尾加和大于目标值,则尾部向前挪;若首尾加和小于目标值,则首部向后挪,这个做法的时间复杂度为O(n)。所以总体算法的时间复杂度为O(nlogn)。


0 0