【问题标题】:Algorithm of O(nlogn) to search for sum of two elements in two arraysO(nlogn) 的算法来搜索两个数组中两个元素的总和
【发布时间】:2018-03-17 13:15:42
【问题描述】:

给定两个 排序 整数数组 A1、A2,长度相同 n 和一个整数 x,我需要编写一个在 O(nlog(n)) 中运行的算法确定是否存在两个元素a1, a2(每个数组中的一个元素)构成a1+a2=x

起初我想有两个索引迭代器i1=0, i2=0(每个数组一个),它们从 0 开始并一次增加一个,具体取决于 A1 的下一个元素是否大于/小于 A2 的下一个元素。但是在两个数组上测试之后,我发现它可能会错过一些可能的解决方案......

【问题讨论】:

标签: algorithm


【解决方案1】:

好吧,因为它们都已经排序,算法应该是 O(n)(排序是 O(n * log(n))):

i1 = 0
i2 = A2.size - 1
while i1 < A1.size and i2 >= 0
    if A1[i1] + A2[i2] < x
        ++i1
    else if A1[i1] + A2[i2] > x
        --i2
    else
        success!!!!

【讨论】:

  • 你是怎么想到这个的?我自己在大学里遇到了麻烦
【解决方案2】:

这是一个奇怪的问题,因为有一个不恰当的及时解决方案 O(N Lg N)(对于 A1 的每个元素,通过二分法搜索查找 A2 以找到 x-a1),而且一个只需要 O(N) 操作的好问题。

从A1的左边和A2的右边开始,在A2中向左移动a1+a2≥x。然后在 A1 中向右移动一个位置,如果需要,在 A2 中更新...

【讨论】:

    【解决方案3】:

    您从索引 = 0 = i 开始一个数组,而另一个数组则从相反的 other = j 开始。 第一步,您知道列表 A 中的最小值和列表 B 中的最大值,因此您从 x 中减去 i,然后将 j 索引向下移动,直到值 =

    基本上你有 2 个索引向中间移动 如果索引 i 的值 > 索引 j 的值,则不存在与 x 匹配的总和。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-01
      • 2014-09-07
      • 1970-01-01
      • 1970-01-01
      • 2021-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多