O(NlogN)找到3个数字,这些数字在数组中具有任意T的总和

时间:2009-12-07 17:29:15

标签: algorithm

给定一个整数数组A,找到任何三个与任何给定T相加的结构。

我在一些在线帖子上看到了这一点,声称它有一个O(NlogN)解决方案。

对于2个数字,我知道散列表可以帮助O(N),但对于3个数字,我找不到一个。

我也觉得这个问题听起来很熟悉一些难题,但不记得这个名字,因此不能谷歌。 (虽然最坏的显然是O(N ^ 3),并且对于2个数字的解,它实际上是O(N ^ 2))

它并没有真正解决现实世界中的任何事情,只是让我感到烦恼..

有什么想法吗?

6 个答案:

答案 0 :(得分:14)

我认为您的问题等同于3SUM problem.

答案 1 :(得分:3)

对于三和问题,你找不到比O(n ^ 2)更好的解法。您可以参考http://en.wikipedia.org/wiki/List_of_unsolved_problems_in_computer_science

答案 2 :(得分:2)

2SUM问题可以在O(nlgn)时间内解决。

首先对最多需要O(nlgn)操作的数组进行排序。现在在第i次迭代中,我们选择了元素a[i]并在数组的其余部分找到了元素-a[i](即从i+1n-1),这个搜索可能是在二进制搜索中进行,最多花费lgn时间。总的来说,它需要O(nlgn)操作。

但是3SUM问题无法在O(nlgn)时间内解决。我们可以将它减少到O(n ^ 2)

答案 3 :(得分:0)

听起来像是一个家庭作业问题......

如果您可以找到两个总和为 N 的值,但是您希望将搜索范围扩展到三个值,那么对于集合中的每个值 M ,您都不能,找两个总和为(N - M)的值?如果在O(log N)时间内找到两个与特定值相加的值,则该值为O(N log N)。

答案 4 :(得分:0)

我认为这只是subset sum问题

如果是,则为NP-Complete。

编辑:没关系,这是3sum,如另一个答案所述。

答案 5 :(得分:-2)

直接从https://en.wikipedia.org/wiki/3SUM

取消
    sort(S);

    for i=0 to n-3 do

        a = S[i];
        start = i+1;

        end = n-1;

        while (start < end) do

           b = S[start];
           c = S[end];
           if (a+b+c == 0) then
              output a, b, c;
              // Continue search for all triplet combinations summing to zero.
               start = start + 1
               end = end - 1

           else if (a+b+c > 0) then
              end = end - 1;
           else
              start = start + 1;
           end
        end
     end