description
题目出处:leetcode
Given an array of integers, return indices of the two numbers such that they add up to a specific target.
You may assume that each input would have exactly one solution.
Example:1
2
3
4Given nums = [2, 7, 11, 15], target = 9,
Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].
解读
- 给定一个包含多个数字的数组,返回两个值的下标,这两个值相加恰好等于target
- 可确定的是,答案有且只有一个
Solution version alpha
- 创建一个字典,使用nums中的值作为key,下标作为value,这样可以迅速通过nums中的值获取其下标;
- 遍历nums中的值,如果target - nums中的数存在,则说明配对成功,这样直接通过这些值就能获取到下标作为返回值返回了。
代码如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15class Solution(object):
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
num_map = {}
for i, value in enumerate(nums):
num_map[value] = i
for value in nums:
index = target - value
if index != value and index in num_map:
return [num_map[value], num_map[index]]
存在一个bug:当nums中有重复数字时,num_map只会存一个数字的下标,会导致信息丢失。如:
nums = [3, 3, 4, 5], target = 6
此时是获取不到正确的答案的。
Final solution
- 由于上一个步骤中,在构建字典过程中会导致同样值的key被覆盖,所以我们在构建字典过程中进行运算;
- 在构建字典过程中,遍历nums时,如果target-num已经存在于字典中,那么匹配成功,返回其相对应的下标即可;
- 否则,将当前的值加入到字典中,以备后续查找。
代码如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14class Solution(object):
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
num_map = {}
for i in range(len(nums)):
another = target - nums[i]
if another in num_map:
return [num_map[another], i]
else:
num_map[nums[i]] = i