题目
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
解法
一种很容易想到的解法就是,遍历数组,对于每个元素a,看看数组中是否存在target-a的元素,如果有并且target-a的索引和a的索引不同时,返回结果。
上面的解法每次找到target-a之后还要比较和a的索引是否相同,并且实际上这种方法存在冗余。比如遍历到前面的元素p时,会和后面的元素q比较,而遍历到q时,又会和p比较,这实际上是多余的。为了解决上述两个问题,可以遍历元素的时候,只和它前面或者只和它后面的元素进行比较,这样既不会重复比较,也不需要判断索引是否相同。
目前讨论的解法都是暴力搜索,时间复杂度是O(n^2)。比较的过程可以改用hashmap来做:
在遍历每个元素a的时候,先看hashmap中是否有target-a,如果有,找到答案。否则,将a存到hashmap中。因此,hashmap中存放的实际上就是前面的元素,每次查hashmap,实际上是拿当前值和前面的比较,如果查到了,后面的就不用处理了。但是如果先将所有元素都放到hashmap,实际上就把后面不必要的都存了,本题只要求一个解就行,因此一边看一边存非常好。
代码
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
hashmap = {} # 创建一个hashmap,键为nums中的数字,值为数字所对应的索引
for i in range(len(nums)):
if target - nums[i] in hashmap:
return [hashmap[target - nums[i]], i]
hashmap[nums[i]] = i