对于两个求和问题,在列表中找到两个加起来的数字。
我的解决方案是创建一个字典/ hash_table,然后将所有内容存储为(value, index)
[注意:对于列表中的重复数字:更高的索引会覆盖较低的索引]
然后再次遍历列表以查找其他项目。
def twoSum(nums, target):
lookup = dict((v, i) for i, v in enumerate(nums))
for i, v in enumerate(nums):
if target - v in lookup and i != lookup[target-v]:
return [lookup[target - v], i]
我认为上面的算法需要O(n * n / 2)=,因此O(n ^ 2)时间,但我看到其他人说它只需要线性时间。有人可以证实吗?
答案 0 :(得分:3)
该算法需要恒定时间,因为操作target - v in lookup
在恒定时间内运行。 for
循环只有一个深度。
def twoSum(nums, target):
lookup = dict((v, i) for i, v in enumerate(nums)) # N
for i, v in enumerate(nums): # N
if target - v in lookup and i != lookup[target - v]: # average constant
return [lookup[target - v], i] # constant
如果您执行O(N)
操作,然后执行其他O(N)
操作,则序列仍为O(N)
。
这里我们只讨论平均时间复杂度。有很多冲突的哈希函数可能非常糟糕,因此target - v in lookup
实际需要O(N)
时间,因此最坏情况的复杂性实际上是O(N^2)
。但是使用dict
,您不太可能遇到这种情况。