我正在研究一个问题:给定一个任意列表,在这种情况下它是[9,15,1,4,2,3,6],找到任何两个可以求和给定结果的数字(在此案例10)。最有效的方法是什么?就大O符号而言,我的解决方案是n 2 ,即使我已对数字进行过滤和排序,我确信有一种方法可以更有效地完成此操作。提前致谢
myList = [9,15,1,4,2,3,6]
myList.sort()
result = 10
myList = filter(lambda x:x < result,myList)
total = 0
for i in myList:
total = total + 1
for j in myList[total:]:
if i + j == result:
print i,j
break
答案 0 :(得分:2)
O(n log n)解决方案
对列表进行排序。对于列表中x
的每个号码S - x
,binary search。
O(n)解决方案
对于每个号码x
,请查看哈希表中是否有S - x
。将x
添加到hash table。
请注意,如果您的数字非常小,则哈希表可以是h[i] = true if i exists in the hash table and false otherwise
的简单数组。
答案 1 :(得分:1)
为此使用字典,对于列表中的每个项目,在字典中查找total_required - item
。我在这里使用了collections.Counter
,因为如果set
等于列表中的当前项,total_required - item
可能会失败。总体复杂性为O(N)
:
>>> from collections import Counter
>>> def find_nums(total, seq):
c = Counter(seq)
for x in seq:
rem = total - x
if rem in c:
if rem == x and c[rem] > 1:
return x, rem
elif rem != x:
return x, rem
...
>>> find_nums(2, [1, 1])
(1, 1)
>>> find_nums(2, [1])
>>> find_nums(24, [9,15,1,4,2,3,6])
(9, 15)
>>> find_nums(9, [9,15,1,4,2,3,6])
(3, 6)
答案 2 :(得分:0)
我认为,这个解决方案可行......
list = [9,15,1,4,2,3,6]
result = 10
list.sort()
list = filter(lambda x:x < result,list)
myMap = {}
for i in list:
if i in myMap:
print myMap[i], i
break
myMap[result - i] = i