繁体   English   中英

在 O(n * log n) 时间内找到 Array 中加起来等于目标数的两个元素

[英]Find Two elements in the Array that add up to the Target number in O(n * log n) Time

我对O(n * log(n))搜索算法有疑问。

我必须从一个数组中找到两个加起来等于给定数字的数字。

我知道O(n * log(n))是如何工作的,但是如果我这样做,我不确定这两个正确的数字是否会在搜索中相遇:

for (int i = 0; i < n; i++)
    for (int j = 1; j <= n; j = j*2)

有没有办法保持O(n * log(n))复杂性,以便每两个数字在搜索中相遇?

  1. 排序数组 (O(nlogn))

  2. 对于每个元素:

    2.1 二进制搜索以找到加起来等于给定数字的其他元素(或找出没有)(O(logn))

步骤 2 的复杂度为 O(nlogn),因此整个算法的复杂度为 O(nlogn)

我必须从一个数组中找到两个加起来等于定数字的数字

它可以在O(n)时间内完成并利用额外的O(n)空间。

为此,我们可以索引Map中的所有数组元素 映射的关键目标总和与特定数组元素和之间的差异 - 元素本身。 地图的创建需要对源数组进行一次迭代,即花费O(n)时间。

如果目标总和是偶数并且只有一个数组元素完全等于target sum / 2 ,则结果将不正确。 为了处理这种情况,我们可以计算等于总和一半的元素的数量。 它可以与生成地图的过程同时完成,以避免执行额外的迭代(尽管它与干净的编码实践相矛盾)。

然后我们需要检查数组中是否存在与map中包含的之一匹配的元素。 如果找到了这样的元素,那么我们就有一对产生目标总和的数字。

所以我们只需要对源数组执行2次迭代,结果就是O(n)的整体时间复杂度。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM