【问题标题】:How to find two number whose sum is given number in sorted array in O(n)?如何在O(n)的排序数组中找到两个总和为给定数字的数字?
【发布时间】:2017-06-06 05:46:51
【问题描述】:
public static void findNumber(int number) {
    int[] soretedArray = { 1, 5, 6, 8, 9 };
    for (int i = 0; i <= soretedArray.length; i++) {
        for (int j = i + 1; j < soretedArray.length; j++) {
            if (soretedArray[i] + soretedArray[j] == number) {
                System.out.println(soretedArray[i] + "::" + soretedArray[j]);
                return;
            }
        }
    }
}

使用此代码,我能够找到数字,其复杂度为 O(N^2),但我必须使用 O(N) 复杂度来找到它,即在 Java 中仅使用一个 for 循环或哈希映射或类似的。

【问题讨论】:

标签: java algorithm search big-o


【解决方案1】:

the Google video that Alexander G is linking to 中所述,使用两个数组索引。将一个初始化为第一个元素 (0),另一个初始化为最后一个元素 (sortedArray.length - 1)。在一个循环中,检查两个索引处的两个元素的总和。如果总和是您要查找的数字,那么您就完成了。如果太高,则需要在其中一个索引处找到较小的数字;将右索引向左移动一步(由于数组已排序,这是正确的方法)。另一方面,如果你得到的总和太低,将左边的索引向右移动以获得更高的第一个加数。当两个索引相遇时,如果你还没有找到你要找的总和,那就没有。此时你已经通过循环n - 1 次,所以算法运行在 O(n) 中。

我们应该首先检查前提条件,即数组确实已排序。这也可以在 O(n) 中完成,因此不会违反任何要求。

如果您需要找到所有可能产生所需总和的数字对,而不仅仅是一对,则该算法可能需要改进。

当视频链接已经说过时,这个答案是多余的吗?一方面,我的解释更短,所以如果它足够了,你就可以了。最重要的是,如果视频被删除或只是移动到另一个 URL,我的答案仍然会在这里。

【讨论】:

  • 如果有人不想按照视频链接进行简单的解释,就像我现在一样......你的答案就在这里供我们阅读:-)
【解决方案2】:

我记得,我正在观看有关此问题的 Google 官方视频。尽管它没有在 java 中演示,但它在问题的不同变体中逐步解释。你一定要检查一下:

How to: Work at Google — Example Coding/Engineering Interview

【讨论】:

  • 彻底解释的答案,就是这样。视频时长为 24 分钟。正如 Rishav 在评论中所说,它使用两个(指针)数组索引。它在 O(n) 中运行。
【解决方案3】:

使用固定的number,对于数组中任何选定的x,您只需查找number-x 是否在数组中(注意您也可以绑定x)。这不会给你 O(n),而是 O(n.log(n))。

如果你有a_ia_j (j&gt;i),也许通过评论,求和并与number 比较,如果结果更大,下一个有趣的测试是a_(i-1)a_(j-1) ,如果结果较低,下一个有趣的测试是 a_(i+1)a_(j+1),是否会提示线性时间?

【讨论】:

  • o(n) 算法使用the two pointer algorithm
  • 我不知道,谢谢!我重新发现了它的基础知识,但没有时间深入挖掘。
  • @Rishav 据我所知,两个指针算法仅在数组排序时有效。
  • @AmitKumar OP 说它已排序。
  • @Enzokie 我的错!!
猜你喜欢
  • 1970-01-01
  • 2012-03-28
  • 2023-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-28
  • 1970-01-01
  • 2012-07-27
相关资源
最近更新 更多