- 题目:给定一个整数数组nums和一个整数target,返回数组两个元素下标,这两个元素之和等于target(对于一个target,这个数组中只有两个元素之和会等于target)
例如:nums = [2, 7, 11, 15], target = 9
nums[0] + nums[1] = 2 + 7 = 9
所以返回结果为[0,1]
思路:这道题如果用两个for循环肯定可以可以得出结果,但是效率太低。
换一种思路:利用一次遍历,在遍历的过程中把
(target-nums[i],i)用hashmap存储,这样只要判断Map中的key是否已经存在,若存在,则找到了这样一对数(时间复杂度为o(n))如果题目给出的数组是排好序的,还可以用两个指针来做(类似于二分查找)
但这个题目中不适合用两个指针(给数组排完序后,不好确定元素的原来的index)
代码:
public class Solution {
public int[] twoSum(int[] nums, int target) {
int len = nums.length;
if(len < 2){
return null;
}
int[] result = new int[2];
Map<Integer,Integer> map = new HashMap<>();
for(int i = 0; i < len; i++){
int value = target - nums[i];
if(map.containsKey(nums[i])){
result[0] = map.get(nums[i]);
result[1] = i;
break;
}else{
map.put(value,i);
}
}
return result;
}
}
数组中很多时候都可以用双指针来处理