algorithm - 在未排序的数组中找到 2 个等于给定总和的数字

标签 algorithm language-agnostic

我们需要在一个数组中找到一对数字,其总和等于给定值。

A = {6,4,5,7,9,1,2}

总和 = 10 那么这些对是 - {6,4} , {9,1}

我有两个解决方案。

  • O(nlogn) 解决方案 - 使用 2 个迭代器(开始和结束)排序 + 校验和。
  • O(n) 解决方案 - 散列数组。然后检查哈希表中是否存在sum-hash[i]

但是,问题是第二个解决方案虽然是 O(n) 时间,但也使用 O(n) 空间。

所以,我想知道我们是否可以在 O(n) 时间和 O(1) 空间内完成。这不是家庭作业!

最佳答案

使用就地基数排序和 OP 的第一个解决方案,两个迭代器相互靠近。

如果数组中的数字不是某种多精度数字,而是例如 32 位整数,您可以在 2*32 遍中对它们进行排序,几乎不需要额外的空间(每次 1 位)。或 2*8 遍和 16 个整数计数器(每遍 4 位)。


2 个迭代器解决方案的详细信息:

第一个迭代器最初指向已排序数组的第一个元素并向前推进。第二个迭代器最初指向数组的最后一个元素并向后推进。

如果迭代器引用的元素总和小于所需值,则推进第一个迭代器。如果它大于所需值,则推进第二个迭代器。如果等于要求的值,则成功。

只需要一次pass,所以时间复杂度是O(n)。空间复杂度为 O(1)。如果使用基数排序,整个算法的复杂度是一样的。


如果您对相关问题(大于 2 个数字的总和)感兴趣,请参阅 "Sum-subset with a fixed subset size""Finding three elements in an array whose sum is closest to an given number" .

关于algorithm - 在未排序的数组中找到 2 个等于给定总和的数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9656789/

相关文章:

php - 您对三元运算符使用哪种编码风格?

language-agnostic - 如何在社交交易环境中使用 DHT

algorithm - 将二进制数组分成三部分,使每个部分代表相同的小数

algorithm - 确定图形是否包含三角形?

java - JSch 异常 : Algorithm negotiation fail diffie-hellman-group14-sha1

arrays - 就地数组重新排序?

algorithm - 搜索算法 : Parsing and processing a request OOP style

language-agnostic - 单例在编程中的用途

python - 使用 Python 解析混合平面文件数据以写入 xls

algorithm - 以 O(1) 复杂度计算给定范围内数字的倍数?