题目描述
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
示例
给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1]
解答
找两个数和等于 target,第一反应就是暴力枚举。假设数组长度为 n,那么一个双重循环就可以搞定。
class Solution: def twoSum(self, nums: List[int], target: int) -> List[int]: lens = len(nums) for i in range(lens-1): for j in range(i+1,lens): if nums[i] + nums[j] == target: return [i, j]
这样做当然是正确的,但显然不是最好的答案。根据经验,一般情况下 O(n^2) 的算法都不是最优解。
引入 map
map 是一个非常常用的容器,用来存储 key-value 格式的数据对。在这道题中,我们可以将元素和它在数组当中对应的下标存储进 map 中。也就是说我们把所有数据对应的下标存储好了之后,我们在遍历的时候,就可以去掉 j 那一重循环,而直接判断 target-a[i] 在不在 map 中即可。
class Solution: def twoSum(self, nums: List[int], target: int) -> List[int]: lens = len(nums) for i in range(lens): a = target - nums[i] if a in nums: j = nums.index(a) if i == j: continue else: return [i, j]