给出一个数字列表,找到哪三个总和为x的最有效方法是什么?

时间:2014-03-04 08:49:39

标签: python

假设我的列表是l = [1,2,3,4,5]x = 8

我在想我应该使用(for i in l:)遍历列表并检查列表中的2个数字是否使用递归加起来x-i。但这似乎不是解决问题的最有效方法。

有人可以在Python中向我展示更好的方式吗?感谢

3 个答案:

答案 0 :(得分:0)

我的想法是遍历列表,但要将三个候选者保留在三个变量中。然后,当您在列表中前进时,可以使用新值替换它们,以便接近所需的值。

例如: c1 = 1; c2 = 2; c3 = 3; 1 + 2 + 3 = / = 8 下一个元素是4 尝试替换最小的候选者,在这种情况下c1:4 + 2 + 3> 8 尝试下一个,c2:1 + 4 + 3 == 8 端

这个想法是根据新的一些人接近或不超过期望值的数量来替换候选人。 如果遍历整个列表但找不到合适的匹配,则可以运行另一个迭代以确保,或者宣布列表不包含任何此类数字。这在很大程度上取决于列表是否已排序。

这个算法可能需要改进,它只是从我的头脑中开始,但我认为它传达了一个你可以使用的想法。

希望它有所帮助。

答案 1 :(得分:0)

我不能说它是一个可行或有效的解决方案,但它确实有效。

>>> while True:
...     a = random.sample([1, 2, 3, 4, 5],  3)
...     if sum(a) == 8:
...         print a
...         break
... 
[3, 1, 4]
>>> while True:
...     a = random.sample([1, 2, 3, 4, 5],  3)
...     if sum(a) == 9:
...         print a
...         break
... 
[2, 3, 4]

答案 2 :(得分:0)

感谢大家的帮助!我不知道这类问题属于一个称为子集的类别,更具体地说是rSum。

对于那些感兴趣的人=)

l = [7,3,1,4,5]

def sum_to_x(l,x):

l.sort()
for i, val in enumerate(l):
    lower = 0
    upper = len(l)-1
    while lower < i < upper:
        temp = val + l[lower] + l[upper]
        if temp > x:
            upper -= 1
        elif temp < x:
            lower += 1
        else:
            yield l[lower], val, l[upper]
            lower += 1
            upper -= 1