2017-05-06 148 views
0

给定n个元素的SORTED数组。从数组中找出三个数字,它们将加起来给定数字k。3对已排序的数组进行排序。 O(NlogN)实现

下面是我一直想到现在: 我们从两个变量L和H开始,它们存储数组中第一个元素和最后一个元素的索引。在这些索引处添加元素,并从k中减去它并将其存储在一个变量中,比如z。 现在,由于数组已排序,我可以在数组中进行二进制搜索。如果发现z,我有三个数字。如果z没有找到,我不得不增加L或递减H.

现在我不知道何时增加L或何时递减H. 任何想法?

回答

0

https://en.wikipedia.org/wiki/3SUM

计算机科学未解决的问题:是否有一个算法解决3SUM问题及时O(n^(2-e))一些e > 0

另一句名言:

目前最有名的算法3SUM在O(n^2/(log n/log log n))时间

运行,因此没有已知的O(nlogn)算法针对此问题。维基百科二次算法:

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. 
      end = end - 1 
     else if (a+b+c > 0) then 
      end = end - 1; 
     else 
      start = start + 1; 
     end 
    end 
end 
+0

维基说:**低于第一各种各样的输入阵列算法然后测试以避免需要在排序列表中的对折半查找小心为了所有可能的对,实现最坏情况{\ displaystyle O(n^{2})} O(n^{2})time。** 这里,它说它避免了需要做二分搜索,我不明白为什么我们是否必须避免二分查找?另外,在我们的例子中,数组已经排序,我们不能使用这个事实并且使用二分搜索来获得更好的结果吗? – StillLearning

+0

@StillLearning,我们避免二分搜索,因为二分搜索的复杂性将是O(n^2 * logn)(a和b的两个嵌套循环,以及c的二分搜索)。排序是O(n * logn),所以它对整体算法复杂度没有影响。 – DAle

+0

好吧。谢谢! – StillLearning