【问题标题】:Algorithm to find three elements which sum to zero in O(n log n) time complexity在 O(n log n) 时间复杂度中找到三个总和为零的元素的算法
【发布时间】:2021-11-24 14:51:26
【问题描述】:

假设输入的 n 个整数数组只包含 -5000n 到 6000n 之间的整数。 我们需要找到一种算法来确定数组是否包含三个元素 总和为零,在 O(n log n) 时间内。

我的方法:

1. Sort in O(n log n) time.
2. Run a loop in O(n) time
3.     Fix two left and right pointers in the sorted array as the two endpoints
4.     find = SUM - (A[left] + A[right])
5.     Search for the third element (find) using binary search in O(log n)
6.     if found then return TRUE
7.     else 
8.         

我被困在第8步,如果二分搜索算法返回false,那么应该如何调整左右指针?

此外,由于我没有评估所有可能的组合,因此整个算法是否可以在每种情况下找到总和为零的三个元素?

提示 - 使用多项式 FFT 算法给出 Ref1 FFT, Ref2 FFT

【问题讨论】:

  • -5000n 和 6000n 这些数字中的 n 是什么意思?
  • 你能分享一下这个问题的约束吗?
  • [-5000n, 6000n ] 是数组可以包含的整数范围。
  • 如果你想要 O(n^2) 求解,我会和你分享
  • 如果可能的话,如果可以投票,否则下次我将无法发布。

标签: arrays algorithm time-complexity


【解决方案1】:

您没有走上 O(N log N) 算法的道路。你的算法要么是 O(N2) 要么是坏的,这取决于你如何完成它。

这个问题是用FFT卷积来解决的,像这样:

  1. 分配一个大小为 W 的数组,其中 W 是 2 的幂并且大于 22001N。

  2. 用零填充数组,然后为输入数组中的每个值 v 设置 array[v+5000N]=1。

  3. 将数组与自身卷积:计算 FFT,对每个结果值求平方,然后计算 IFFT。

  4. 对于输入中的每个值 v,检查 ifft[10000N-v] > 0。如果是,则输入中有两个数字相加为 -v。对输入数组进行排序并使用传统的两指针搜索来查找其他两个数字。

【讨论】:

    猜你喜欢
    • 2015-06-12
    • 2015-05-25
    • 2011-07-09
    • 1970-01-01
    • 1970-01-01
    • 2021-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多