题目描述
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
解答
使用Map来实现时间复杂度为n的解法
思路
首先构建一个Map,Key是数组中元素的值,Value是数组中对应元素的下标。然后遍历数组,把数组中元素的值和索引放到Map中。在遍历的时候就可以直接用Map的get方法,用目标值减去当前元素的值得到要找到的值,如果Map里面不为空,就直接返回。
可能遇到的问题
- 数组中有重复的元素怎么办? 数组中有重复的元素,那么在put到Map的时候就会更新当前重复元素的索引,对于本题无影响。
- 如果最后没找到怎么办? 题目保证了一定会有答案
代码
public int[] twoSum(int[] nums, int target) {
//check
if (nums == null) {
return new int[]{-1,-1};
}
Map<Integer,Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
int item = nums[i];
int find = target - item;
if (map.get(find) != null) {
return new int[]{map.get(find),i};
}
map.put(item, i);
}
return new int[]{-1,-1};
}
总结与回顾
回顾
用到的数据结构
- 数组
- Map
用到的思想
遇到需要查找当前值是否存在的时候,一般用Map最快
总结
本题主要用到了Map的put和get方法,和数组的遍历,难度简单,主要是想出来 find = target - item 这个最重要。