【问题标题】:3Sum on a sorted array. O(NlogN) implementation3对排序数组求和。 O(NlogN) 实现
【发布时间】:2017-05-06 14:30:54
【问题描述】:

给定一个由 n 个元素组成的 SORTED 数组。从数组中找出三个加起来等于给定数字 k 的数字。

这是我到目前为止的想法: 我们从两个变量 L 和 H 开始,它们存储数组中第一个和最后一个元素的索引。在这些索引处添加元素并从 k 中减去它并将其存储在变量中,例如 z。 现在由于数组已排序,我可以在数组中对 z 进行二进制搜索。如果找到 z 我有这三个数字。如果没有找到 z,我必须增加 L 或减少 H。

现在我不知道何时增加 L 或何时减少 H。 有什么想法吗?

【问题讨论】:

    标签: arrays algorithm binary-search


    【解决方案1】:

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

    计算机科学中未解决的问题:有没有一种算法可以及时解决O(n^(2-e)) 的一些e > 0 的3SUM 问题?

    另一个引用:

    目前最知名的 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
    

    【讨论】:

    • Wiki 说:下面的算法首先对输入数组进行排序,然后以谨慎的顺序测试所有可能的对,从而避免对排序列表中的对进行二分搜索,从而实现最坏的结果- case {\displaystyle O(n^{2})} O(n^{2}) 时间。 这里,它说它避免了进行二分查找的需要,我不明白我们为什么要这样做必须避免二分查找。另外,在我们的例子中,数组已经排序,我们不能利用这个事实并使用二进制搜索来获得更好的结果吗?
    • @StillLearning,我们避免二分查找,因为二分查找的复杂度为 O(n^2*logn)(a 和 b 的两个嵌套循环,c 的二分查找)。排序是 O(n*logn),所以它对整体算法复杂度没有影响。
    猜你喜欢
    • 2021-07-08
    • 1970-01-01
    • 2015-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多