题目:
给定一个整数数组
nums
和一个目标值target
,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中的元素。
示例:
给定 nums = [2,7,11,15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0,1]
作为Leetcode上的第一题,这道题的提交次数达到了60多万,通过率也达到了45%以上,是一道不折不扣的简单题。
思路:
首先把题目用数学公式表达出来:target = x + y,其中x和y是数组中的元素。由于target是输入量,是已知的,当我们确定了x的时候y也就确定了(y = target - x)。所以我们可以遍历nums中的元素nums[i],然后判断target - nums[i]是否在数组中即可。
解法一:
这种解法就是直白的把上面的解题思路用代码表示出来了:
1、创建一个HashMap
2、把nums中的每一个元素加入到map中去,key为num[i],value为i
3、循环遍历nums[i],从判断map中是否存在target - num[i],如果存在就是我们要找的值。
public int[] solution1(int[] nums, int target){
HashMap<Integer, Integer> map = new HashMap<Integer, Integer>(8);
int[] res = new int[]{-1, -1};
for (int i = 0; i < nums.length; ++i) {
map.put(nums[i], i);
}
for (int i = 0; i < nums.length; ++i) {
int t = target - nums[i];
if (map.containsKey(t) && map.get(t) != i) {
res[0] = i;
res[1] = map.get(t);
break;
}
}
return res;
}
解法二:
这种解法本质上和上面的差不多,只是把两次循环换成了一次循环。在循环时先判断map中是否存在target - nums[i],如果存在就表明找到想要的数据了,如果不存在就把nums[i]添加到map中去。
public int[] solution2(int[] nums, int target){
HashMap<Integer, Integer> map = new HashMap<Integer, Integer>(8);
int[] res = new int[]{-1,-1};
for (int i = 0; i < nums.length; ++i) {
if (map.containsKey(target - nums[i])) {
res[0] = i;
res[1] = map.get(target - nums[i]);
break;
}
map.put(nums[i], i);
}
return res;
}
更多LeetCode文章:
https://github.com/ybjx/Leetcode
遗留问题:
上面的两种实现方法都使用了HashMap,并且把nums[i]作为key存放加入到map中去,从题目中我们发现,并没有说nums中的值不能重复。那么如果出现了重复的值会如何呢?上面的解法还能正常工作吗?
扫码关注
头条号: 微信公众号: