我试图解决leetcode中的twoSum问题 Two Sum - LeetCode
给出一个整数数组,返回两个数字的指数,以便它们加起来成为一个特定的目标。
您可以假设每个输入将具有恰好一种解决方案,并且您可能不会两次使用 same 元素。
示例:
Given nums = [2, 7, 11, 15], target = 9, Because nums[0] + nums[1] = 2 + 7 = 9, return [0, 1].
我的解决方案:
1.确定第一个数字,然后搜索(目标-first)
2.使用哈希表查找索引
class Solution():
def twoSum(self, nums: List[int], target: int) -> List[int]:
# nums_d: {value:index}
nums_d = {nums[i]:i for i in range(len(nums))}
for i in range(len(nums)):
find = target - nums[i]
print('find: ', find)
nums_d.pop(nums[i]) #Avoid use an element twice
j = nums_d.get(find)#hash table to search
print('j: ',j)
if j:
return [i, j]
return None
和测试代码
target = random.randrange(200,300)
nums = list(range(150))
nums = random.choices(nums, k=100)
solution = Solution()
print(solution.twoSum(nums, target))
运行时报告KeyError
In [131]: !python twoSum.py
find: 168
j: None
find: 183
j: None
find: 216
j: None
find: 163
j: None
find: 182
j: None
find: 169
j: None
find: 235
j: None
find: 169
Traceback (most recent call last):
File "twoSum.py", line 67, in <module>
print(solution.twoSum(nums, target))
File "twoSum.py", line 57, in twoSum
nums_d.pop(nums[i]) #Avoid use an element twice
KeyError: 122
我找不到第nums_d.pop(nums[i])
行的问题
答案 0 :(得分:3)
您的字典大小随着pop
的减小而减小,而i
则增加到列表的(原始)长度,在某些时候,您将引用一个比列表大的键,得到KeyError
。
您想要的东西是这样的:
for i, k in enumerate(nums_d.keys()):
# code stuff
这样,您将i
作为要在nums
中执行索引的范围,并且您拥有k
引用了nums_d
中的每个键,以便使用pop
,并避免两次使用元素。