【问题标题】:finding a triplet having a given sum找到一个给定总和的三元组
【发布时间】:2011-03-25 08:00:10
【问题描述】:

我一直在为这个问题苦苦挣扎。问题是这样的:-

我们有 n^2 个数字。我们需要找出是否存在三元组 a,b,c 使得 a+b+c = 0。对于更一般的情况,a+b+c = k。 (给定k)

存在一个复杂度为 O(n^2log(n)) 的解决方案。

任何帮助将不胜感激。

谢谢

【问题讨论】:

  • 您可能想阅读有关子集和问题的现有文献,这是您所提议的更通用的版本。 en.wikipedia.org/wiki/Subset_sum_problem
  • 只是出于好奇,这是为了欧拉计划吗?
  • 不,这不适用于欧拉项目。几年前,我在一次考试中提出了这个问题。
  • N 个数字是唯一的,还是有重复的?并且: (a != b) && (a != c) ?
  • n^2 个数字是什么意思? n是什么?

标签: algorithm


【解决方案1】:

要在 O(n²logn) 中得到这个,您必须对数字进行排序。找到 2 个数字的所有组合,然后进行二分搜索以找到第三个。

问题的一般版本的上限要高得多。

【讨论】:

  • 组合的数量为 O(n^4)。我们正在寻找优化的解决方案。
  • 所以基本上,换个说法,你是说有 n 个项目,并且在 O(nlog√n) 中有一个解决方案?
  • @Anurag,加油,log√n 等于 ½log n
  • 足够公平的 Pavel,所以它在 O(nlogn).. 在这里我很高兴选择 unicode 字符:)
【解决方案2】:

我写了一个粗略的解决方案。

绝对可以在 O(n^2) 内完成。 您不必对此进行排序。

这是问题的扩展,需要将两个数字相加到 x,诀窍是使用哈希表。

def triplets(l, total):
    """Sum of 3 numbers to get to total 
    Basically an extension of the 2 table 
    """
    l = set( l)
    d = { }

    for i in l:
        remain = total - i

        inside = {}
        for j in l:
            if i == j:
                continue
            inside[j] = remain -j

        d[i] = inside

    good = set()

    for first, dic in d.iteritems():
        for second, third in dic.iteritems():
            if third in l:
                good.add( tuple(sorted([first, second, third])) )

    for each in good: 
        print each

triplets( [2, 3, 4, 5, 6], 3+4+5)

注意:我们可以对三元组使用一种快速排序方法,该方法将是 O(1)。

【讨论】:

  • 能否请您提供 C 或 Java 的解决方案?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-16
  • 1970-01-01
  • 2020-08-24
  • 1970-01-01
  • 1970-01-01
  • 2016-08-04
相关资源
最近更新 更多