4

给定一个排序的整数数组,我们如何找到一对和为 K 的整数?

例如array = 1,3,5,6,10, K = 6, 答案是 1 和 5。

时间复杂度应该最小化。

4

3 回答 3

7

你可能想看看这篇博文:

http://www.codingatwork.com/2011/07/array-sum/

我的方法是对列表进行二分搜索K/2,然后a向左走一个变量,向右走另一个变量b以寻找解决方案a+b=K

这个想法是a从小于或等于的最大数K/2开始b,从大于 的最小数开始a。同样,使用二分搜索查找a并让b成为数组中的下一个元素。然后

  • 如果a+b = K,那么return (a,b)
  • 如果a+b < K,则b向右移动一位。
  • 如果a+b > K,则a向左移动一位。

当然,你可以跳过二分查找,只从a数组的开头和数组b的末尾开始,然后做

  • 如果a+b = K,那么return (a,b)
  • 如果a+b < K,则a向右移动一位。
  • 如果a+b > K,则b向左移动一位。

这可能更快。

于 2011-07-17T16:35:54.777 回答
4

有一个线性 (O(n)) 解。

获取一个哈希表并在遍历数组时检查当前元素是否已经在哈希表中 - 如果是,那么您已经找到了答案。否则插入等于 K 减去当前元素的数字。适用于非排序数组,顺便说一句。

int[] ar = new int[] { 1, 4, 3, 5 };
int K = 6;

HashSet<int> set = new HashSet<int>();
foreach (int a in ar)
{
    if (set.Contains(a))
    {
        Console.WriteLine(a + ", " + (K - a));
        break;
    }

    set.Add(K - a);
}
于 2011-07-17T06:14:09.740 回答
0
function findpairzero(arr) {
 let left = 0;
 let right = arr.length - 1;

 while (left < right) {
 if (arr[left] + arr[right] === 0) {
  return [arr[left], arr[right]];
  } else if (arr[left] + arr[right] > 0) {
  right--;
  } else {
  left++;
 }
}
}

console.log(findpairzero([-4, -3, -2, -1, 0, 3, 2, 4, 5]));
于 2021-02-03T14:07:01.173 回答