【问题标题】:Find triplets in an array such that sum of two numbers is also a number in the given array在数组中查找三元组,使得两个数字的总和也是给定数组中的数字
【发布时间】:2015-01-16 11:10:10
【问题描述】:

给定一个数组,例如[1, 0, -1, 2, 3, 4, 5],找到所有长度为 3 的子集,其中一个元素等于子集中其他两个元素的总和。例如:

1 + -1 == 0 (from [1, 0, -1])
2 +  3 == 5 (from [2, 3, 5])

我想出了一个O(n²) 解决方案,但我的面试官坚持认为有一个O(n log n) 解决方案。

解决这个问题的最佳方法是什么?

【问题讨论】:

  • 如果数组是 [0, 0, 0, 0, 0, 0] 有多少个子集?
  • @JasonL 可能是唯一的子集(否则真的没有意义)。或者,也许给定的数组是一个集合/唯一的(也更有意义)。
  • 我认为面试官只是在计数之后?因为有 O(n^2) 个这样的子集并且枚举它们需要 O(n^2) 例如数组 [1 2 3 4 5 6 7 8 9 10]
  • 是的 N 选择 2。N!/(2!*(N-1)!) = N(N-1) 或 O(n^2)。那是我的论点。也许他们想甩掉我
  • 谢谢大家的cmets和回答!我很感激。我的思维过程需要一些验证:)

标签: arrays algorithm data-structures


【解决方案1】:

乍一看,我看不到小于O(n²)的算法。 (除非它是一个非常聪明的人)

这个问题与臭名昭著的 3SUM 问题非常相似:基本上,这个想法是给定一组 n 个元素,是否存在总和为零的三元组?

一种比O(n²) 更快求解 3SUM 的算法未知 - 这是计算机科学中的一个未解决问题...(请参阅此处:http://en.wikipedia.org/wiki/3SUM

但是,由于您的问题并不完全是 3SUM (A+B+C=0),而是涉及 (A+B=C),因此我们不能立即排除巧妙的技巧(但我们确实让它们不太可能发生)。

话虽如此,您的问题可以转化为A+B-C=0,在我看来,这样的解决方案也可以在不到O(n²) 的时间内解决3SUM...


考虑这样一个问题的解决方案:

考虑 2SUM 问题的解决方案(即找到总和为某个值的 2 个元素列表)。我们可以散列数组中的每个元素(或其他具有恒定时间查找的数据类型)。插入每个元素需要O(n) 时间。这是 2SUM 问题的线性解。 (然后循环遍历数组中的每个元素并检查 T-element 的哈希值)

采用这个想法,我们可以散列数组中的每个和。然而,获得所有可能的组合最多需要n*(n-1)O(n²) 时间。


如果有人确实有比O(n²) 更快的解决方案,我将永远敬畏你的数字fu(如果我找到一个,我会编辑这个并吃掉我的话)。

祝您搜索顺利!

【讨论】:

  • 是的,这也是我对面试官的论点。要从 N 个元素中选择 2 对,将导致 N 选择 2 个组合,即 n!/(2!*(n-2)!),即 n*(n-1)。这在数学上是不可能的。:) 我不确定他们在寻找什么。
  • 乍一看,他可能在想 2SUM、最大子序列等……它们的算法确实少于O(n²)。很确定这个不是... O.o
  • 谢谢!我敢肯定她在找这些三胞胎。我通过询问并向她展示我所理解的内容来确保这一点:)。她证实了这一点。自从我知道该算法以来,问题不在于最大子序列。我的猜测是因为我很快就完成了这个问题,所以她试图把我甩开,或者可能想听听不同的方法。再一次感谢你!希望我能得到那份工作!
【解决方案2】:

我遇到了同样的问题 here ,唯一的区别是它只考虑正整数。

关键是,根据这个问题的限制,它还需要一个O(n log(n)) 解决方案,但编辑和解决方案代码给出了一个O(n²) 解决方案,该解决方案在提交时会获得一个AC。

也许你的面试官在某个地方看到了这个问题,但没有通过解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-26
    • 1970-01-01
    • 2011-01-05
    • 2015-10-31
    • 1970-01-01
    • 2018-07-31
    相关资源
    最近更新 更多