【问题标题】:Given a list of numbers, what's the most efficient way to find which 3 of them sum up to x? [duplicate]给定一个数字列表,找出其中 3 个和 x 相加的最有效方法是什么? [复制]
【发布时间】:2014-03-05 02:55:13
【问题描述】:

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

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

有人可以向我展示一个更好的 Python 方法吗?谢谢

【问题讨论】:

  • 谷歌解决子集总和问题
  • 在恰好 3 和一个数字相加的特定情况下,我们可以比一般的子集求和算法做得更好。以前有人问过这个问题;我们应该能够找到重复的问题。
  • 其实他应该能找到的。你为什么要帮助懒惰的人?
  • 因为 StackOverflow 比它应该的更难搜索。我已经重新回答了很多问题,仅仅是因为它比查找重复项要快得多,即使我知道有重复项。
  • 我找到了 stackoverflow.com/questions/1861516/… ,但它也没有真正提供任何代码。已接受答案链接到维基百科上的 3SUM (en.wikipedia.org/wiki/3SUM)。

标签: python


【解决方案1】:

我的想法是遍历列表,但将三个候选人保留在三个变量中。然后,随着您在列表中的进展,您将它们替换为基于的新值,以接近所需的值。

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

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

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

希望对您有所帮助。

【讨论】:

    【解决方案2】:

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

    >>> 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]
    

    【讨论】:

      【解决方案3】:

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

      对于那些有兴趣的人=)

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

      定义 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-11-13
        • 1970-01-01
        • 2011-11-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多