找到两个数字之和的最有效方法

时间:2015-02-07 12:25:52

标签: python algorithm

我正在研究一个问题:给定一个任意列表,在这种情况下它是[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

3 个答案:

答案 0 :(得分:2)

O(n log n)解决方案

对列表进行排序。对于列表中x的每个号码S - xbinary 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