给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
示例:
python:
这里采用一遍hash的方式:
新建一个空的字典,然后遍历数组,如果target-x在字典里面,则返回x和target-x的索引值,如果不在则将该数值加入字典中。
class Solution:
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
hash_map = dict()
for i, x in enumerate(nums):
if target - x in hash_map:
return [i, hash_map[target-x]]
hash_map[x] = i
java :
在遍历数组的过程中,将遍历过的元素都扔到 HashMap 当中。当遍历到当前元素时,查找目标值与当前元素的差值是否在 HashMap 中,如果存在,则算法结束,如果不存在,则将当前元素加入到 HashMap 中,然后遍历下一元素。
为什么能这么做?因为如果输入有解的话,那么要找的那两个元素必定一前一后,当我们遍历到后一元素时,前一元素必定在 HashMap 中,即查找一下 HashMap 便可以得到答案。
class Solution {
public int[] twoSum(int[] nums, int target) {
Map<Integer, Integer> map = new HashMap<>();
int[] result = {0, 0};
for (int i = 0; i < nums.length; i++) {
int v = target - nums[i];
if (map.containsKey(v) && i != map.get(v)) {
result[0] = map.get(v);
result[1] = i;
}
map.put(nums[i], i);
}
return result;
}
}