思路:思路很容易,这题一看就应该时间空间为O(n),所以只要过一遍数组。用哈希表维护数组的值作为key,用数组的index作为value。 遍历数组的时候,用HashMap来查看下是不是有target-numbers[i]这个值,有就可以输出了。遍历一遍找不到就输出空。
注意点:hashmap构建的时候应该是查完当前这个值没有的话就压入hashmap,这样是为了保证查的时候不会查到自身的这个值。如果数组后面有对应的value,等到遍历到那个值的时候自然会查到对应值。
误区:一开始想用夹逼的方法,后来发现返回的是index,如果排序会打乱顺序。用哈希表存这个index的话,到后面查询时,容易只查到第一个index,那样如果有重复的元素就不对了。
代码:
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])){
res[0] = map.get(target-numbers[i]);
res[1] = i+1;
return res;
}
map.put(numbers[i], i+1);
}
return res;
}