首页 文章

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

提问于
浏览
3

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

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

1 回答

  • 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²) 时间 .


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

    祝你好运!

相关问题