def has_sum(lst, c):
lst.sort()
rev = reversed(lst)
end = next(rev)
for item in lst:
while end > c - item:
end = next(rev)
if end == c - item:
return True
if item > end:
return False
O(n)空间,O(n)时间
def has_sum(lst, c):
found = set()
for item in lst:
if c - item in found:
return True
found.add(item)
return False
就地排序可以在
O(n log(n))
时间内完成。随后的搜索也可以在O(n)
时间内完成,结果总共是O(n log(n))
。一旦数据被排序,对于数组的每个元素a
,使用另一端的同时搜索来检查c - a
是否也在数组中。这样你就可以遍历整个数组一次。这种方法是由@RockyLi提出的。它的优点是使用O(1)
额外的内存:输入列表需要在适当的位置进行排序。你知道吗如果使用
O(n)
额外的内存是可以接受的,那么您可以遵循@PatrickHaugh's suggestion。创建一个集合。将列表中的每个元素a
添加到集合中。如果c - a
已经在集合中,则返回True
。这需要O(n)
时间来完成(一次通过),并且不需要排序。但它很可能是你使用的内存量的两倍多。你知道吗以下是玩具实现:
O(1)空间,O(n log(n))时间
O(n)空间,O(n)时间
相关问题 更多 >
编程相关推荐