LeetCode热题Hot (1)
两数之和:
- 给定一个整数数组 arr 和一个目标值 target
- 请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。
思路:
-
一开始考虑的是双指针(参考剑指Offer 42),但是要注意:数组是无序的,如果移动指针,不能确定是要加上还是减去这个值
剑指Offer 42:输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S
-
所以可以借鉴 累加和等于num的最长子数组,可正可负可0 的思路
-
将求和问题转换成剩余需要的数的问题
-
每遍历一个数,就求出当前数还需要的数:
target-arr[i]
,使用HashMap存储当前的数 -
如果map中有该数还需要的数
target-arr[i]
,那么正好可以凑成target,即为答案。
public static int[] twoSum(int[] arr, int target) {
int[] res = new int[2];
HashMap<Integer, Integer> map = new HashMap<>();
for(int i = 0; i < arr.length; i++){
if(map.containsKey(target - arr[i])){
res[0] = i;
res[1] = map.get(target - arr[i]);
break;
}
map.put(arr[i], i);
}
return res;
}