【问题标题】:O(NlogN) finding 3 numbers that have a sum of any arbitrary T in an arrayO(NlogN) 找到 3 个数字,它们的总和是数组中任意 T 的总和
【发布时间】:2009-12-07 17:29:14
【问题描述】:

给定一个整数数组 A,找出其中任意 3 个和任意给定 T 的整数。

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

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

我也觉得这个问题听起来对一些难题很熟悉,但记不起名字,因此无法谷歌。 (虽然最糟糕的显然是 O(N^3),而对于 2 个数字的解决方案实际上是 O(N^2))

它并不能真正解决现实世界中的任何问题,只是让我烦恼..

有什么想法吗?

【问题讨论】:

标签: algorithm


【解决方案1】:

我认为你的问题相当于3SUM problem.

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 不确定该页面以前是什么,但现在不相关了。这就是你引用事物的原因。
    【解决方案3】:

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

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

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

    【讨论】:

    • 对于两个问题,如果我们使用哈希表,它可以减少到 O(N)。
    【解决方案4】:

    听起来像是一道作业题……

    如果您可以找到两个总和为 N 的值,但您想将搜索扩展到三个值,不是吗,对于集合中的每个值 M ,寻找两个总和为 (N - M) 的值?如果您可以在 O(log N) 时间内找到两个总和为特定值的值,那么这将是 O(N log N)。

    【讨论】:

    • 你如何找到两个在 log(N) 时间内总和为特定值的数字?
    • 好问题,我不知道。我没有说这是可能的,只是你需要能够这样做才能以我描述的特定方式解决问题。
    【解决方案5】:

    我认为这只是subset sum 的问题

    如果是,则为 NP-Complete。

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

    【讨论】:

    • 从 n 中选择 3 个数字的方法少于 n^3 种,因此它几乎不可能是 NP 完全的。简单的蛮力算法是 O(n^3)。
    • 是的。子集问题是 NP,但这不是子集问题。子集问题没有指定将多少个数字相加,而这个问题将其限制为正好 3。
    【解决方案6】:

    直接从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
    

    【讨论】:

      猜你喜欢
      • 2013-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多