在数组中查找三元组,使得两个数字之和也是给定数组中的数字

时间:2014-11-19 03:09:32

标签: arrays algorithm data-structures

给定一个数组,例如[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)解决方案。

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

2 个答案:

答案 0 :(得分: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²)更快的解决方案,我将永远敬畏你的数字(如果我找到一个,我会编辑这个并吃掉我的话)。

祝你好运!

答案 1 :(得分:0)

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

重点是,根据这个问题的约束,它也需要一个O(n log(n))解决方案,但是社论和解决方案代码提供了一个O(n²)解决方案,该解决方案在提交时会获得AC。

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