给出一组数字:
1, 2, 8, 6, 9, 0, 4
我们需要找到三个一组中的所有数字,它们总和为N(在本例中为11)。这里,三个一组中可能的数字是:
{1,2,8}, {1,4,6}, {0,2,9}
我能想到的第一个解决方案是O(n ^ 3)。后来我可以通过以下方法改进一点(n ^ 2 log n):
1. Sort the array.
2. Select any two number and perform binary search for the third element.
可以通过其他方法进一步改进吗?
答案 0 :(得分:2)
您当然可以在O(n^2)
中执行此操作:对于数组中的每个i
,请测试其他两个值是否合计为N-i
。
您可以在O(n)
中测试排序数组中的两个值是否一次从两端扫描,总和为k
。如果你所使用的两个元素的总和太大,则递减“从右到左”的索引以使其变小。如果总和太小,则递增“从左到右”索引以使其更大。如果有一对有效,你会找到它们,并且你在一端或另一端跑完道路之前最多执行2*n
次迭代。您可能需要使用代码来忽略您使用的值i
,具体取决于规则。
你可以使用某种动态编程,从N
开始工作,你最终可能会遇到类似O(n*N)
左右的时间。实际上我认为没有更好的:看起来你的所有数字都是非负的,所以如果n
比N
大得多,那么在你开始之前你可以快速抛出任何大数值数组,以及每个值超过3个副本的任何重复项(或2个副本,只要在丢弃3*i == N
的第3个副本之前检查是否i
。完成该步骤后,n
为O(N)
。