从给定的数字数组中,找到3个组中具有和值N的所有数字

时间:2012-06-28 12:17:32

标签: algorithm

给出一组数字:

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.

可以通过其他方法进一步改进吗?

1 个答案:

答案 0 :(得分:2)

您当然可以在O(n^2)中执行此操作:对于数组中的每个i,请测试其他两个值是否合计为N-i

您可以在O(n)中测试排序数组中的两个值是否一次从两端扫描,总和为k。如果你所使用的两个元素的总和太大,则递减“从右到左”的索引以使其变小。如果总和太小,则递增“从左到右”索引以使其更大。如果有一对有效,你会找到它们,并且你在一端或另一端跑完道路之前最多执行2*n次迭代。您可能需要使用代码来忽略您使用的值i,具体取决于规则。

你可以使用某种动态编程,从N开始工作,你最终可能会遇到类似O(n*N)左右的时间。实际上我认为没有更好的:看起来你的所有数字都是非负的,所以如果nN大得多,那么在你开始之前你可以快速抛出任何大数值数组,以及每个值超过3个副本的任何重复项(或2个副本,只要在丢弃3*i == N的第3个副本之前检查是否i。完成该步骤后,nO(N)