Leetcode题目 两数之和

Posted by 大雁小鱼的博客 on May 19, 2018

两数之和

题目:
给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。
你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。

比如给定 nums = [2,7,11,15],target = 9
因为 nums[0] + nums[1] = 2 + 7 = 0
所以返回 [0,1]

这道题其实是一道挺简单的题,大多数人第一眼能想到的解法是穷举,遍历之后输出结果,代码如下

    public int[] twoSum(int[] nums, int target) {
    
        int[] result = new int[2];
        for(int i=0;i<nums.length;i++){
            int a = nums[i];
            for(int j=i+1;j<nums.length;j++){
                int b = nums[j];
                if(a + b == target){
                    result[0] = i;
                    result[1] = j;
                    return result;
                }
            }
        }
        
        return result;
    }

上面这种解法的缺点是复杂度比较高O(N^2),有没有复杂度低一些的解法呢?答案是有的。使用hash的办法缓存下标和值,因为使用了Map,其复杂度不一定是O(1),所以整体复杂度比O(N)高一些
代码如下

public int[] twoSum(int[] numbers,int target){
	int[] res = new int[2];
	if(numbers == null || numbers.length<2)  return res;

	//值 -> 下标  
	HashMap<Integer,Integer> map = new HashMap<Integer,Integer>();
	for(int i=0;i<numbers.length;i++){
		if(!map.containsKey(target-numbers[i])){
			map.put(numbers[i],i);
		}else{
			res[0] = map.get(target - numbers[i]);
			res[1] = i;
			break;
		}
	}
	return res;
}