找到排序数组A中唯一的一对,其总和等于K.

时间:2014-08-01 20:32:10

标签: algorithm

我知道这个问题被问了很多次。但是,在StackOverflow上的所有相关帖子中挖掘之后,我仍然没有找到确定性的答案。你能帮忙吗?

我的问题是,对于这样的问题,是否存在O(log n)解决方案?为了使问题更加清楚,我们可以分别研究两种情况:案例(1)A没有重复和案例(2)A有重复的元素。

我听说基于二进制搜索的解决方案似乎能够实现O(log n),但不明白它是如何做的。这里n是A中元素的数量。

3 个答案:

答案 0 :(得分:1)

假设元素i的每个位置的值都为2i,除了一个位置值为2i + 1的位置。

如果目标值是2n + 1,那么我们必须测试每对i和n-i,直到我们找到2i + 1的位置。

因此,在两种情况下都不可能比O(n)做得更好。

答案 1 :(得分:1)

忘记我之前说过的话。由于它是排序数组,我们可以在 O(N)中执行此操作。

  • 添加第一个最后元素。如果他们等于K,那就完成了。如果总和大于K,则添加第一个& 倒数第二个。如果sum小于k,请添加 second 和最后一个。
  • 重复工作到中间,直到找到正确的总和,或者你在中间相遇。

答案 2 :(得分:0)

创建一个空的HashSet(O(ln n)查找)

遍历数组,对于每个数字n,检查HashSet是否为K-n。如果找到,则完成。如果未找到,则将n添加到hashSet。 (迭代是O(N))

总O(N ln N)