在排序数组中找到一对整数,其总和为K.

时间:2011-07-17 06:02:26

标签: algorithm array-algorithms

给定一个排序的整数数组,我们怎样才能找到一对总和为K的整数?

e.g。 array = 1,3,5,6,0K = 6,答案是1和5。

应尽量减少时间复杂性。

3 个答案:

答案 0 :(得分:8)

您可以查看此博文:

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移至左侧一个位置。

当然,您可以跳过二进制搜索,只需在数组的开头{/ 1}}和数组末尾的a启动,然后执行

  • 如果b,则a+b = K
  • 如果return (a,b),则将a+b < K移至正确的位置。
  • 如果a,则将a+b > K移至左侧一个位置。

这可能更快。

答案 1 :(得分:3)

有线性(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);
}

答案 2 :(得分: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]));