题目
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
分析
1.暴力解法,遍历列表
略去不谈
2.hash表
def twoSum(nums, target):
hashmap={}
for i,num in enumerate(nums):
if hashmap.get(target - num) is not None:
return [i,hashmap.get(target - num)]
hashmap[num] = i
字典不允许有相同key存在,故当有重复元素时会更新。对于[3,3,4],7,会返回一个解[1,2],丢失解[0,2]。但题目允许我们假设只有一个解。
本人思路(仅用于记录思考过程)
- 将list转化为numpy数组,使用广播机制——target减去数组每个元素,得到sub_list
- 取sub_list与nums的交集,如上例可得[2,7],索引每个元素在nums中的index即可。
然而这样想太简单了,如果是[3,2,4],6,应该返回[1,2],如果采用上述方法,sub_list=[3,4,2],交集[3,4,2]这样就出错了,想避免for循环看来是没门
class Solution(object):
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
for i in nums:
element_1 = target - i
index_list = [index for (index,value) in enumerate(nums) if value == element_1]
index_1 = nums.index(i)
if not index_list:
continue
if index_1 in index_list:
index_1 = index_list.pop()
else:
index_2 = index_list[0]
return [index_1, index_2]
try:
index_2 = index_list[0]
except IndexError:
continue
return [index_1, index_2]