给定一个数组,例如[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 :(得分: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。
也许您的面试官在某个地方看到了这个问题,但没有解决问题。