在排序数组中查找总和为 K 的一对整数

发布于 2024-11-24 05:00:37 字数 127 浏览 3 评论 0原文

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

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

时间复杂度应该最小化。

Given a sorted array of integers, how can we find a pair of integers that sum to K?

e.g. array = 1,3,5,6,10, K = 6, the answer is 1 and 5.

Time complexity should be minimized.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

不必在意 2024-12-01 05:00:37

您可能想查看此博客文章:

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

我的方法是对列表进行二分搜索来查找 K/2,然后向左走一个变量 a 并另一个变量 b 正在尝试找到解决方案a+b=K

这个想法是从小于或等于K/2的最大数字开始a并从大于b的最小数字开始。代码>a。再次使用二分查找查找 a 并将 b 设为数组中的下一个元素。然后

  • 如果a+b = K,则返回(a,b)
  • 如果 a+b K,然后将b向右移动一位。
  • 如果a+b> K,然后将a向左移动一位。

当然,您可以跳过二分查找,只在数组开头开始 a,在数组末尾开始 b,然后执行

  • If a +b = K,然后返回(a,b)
  • 如果 a+b K,然后将a向右移动一位。
  • 如果a+b> K,然后将b向左移动一位。

这可能更快。

You may want to look at this blog post:

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

My approach would be to do a binary search of the list for K/2, then walk one variable a left and another variable b right trying to find a solution a+b=K.

The idea would be to start a at the largest number less than or equal to K/2 and start b at the smallest number greater than a. Again, use a binary search to find a and let b be the next element in the array. Then

  • If a+b = K, then return (a,b).
  • If a+b < K, then move b to the right one position.
  • If a+b > K, then move a to the left one position.

Of course, you can skip the binary search and just start a at the beginning of the array and b at the end of the array, and then do

  • If a+b = K, then return (a,b).
  • If a+b < K, then move a to the right one position.
  • If a+b > K, then move b to the left one position.

This is probably faster.

不顾 2024-12-01 05:00:37

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

There is a linear (O(n)) solution.

Take a hashtable and while iterating through the array check if the current element is already in the hashtable - if so then you've found the answer. Otherwise insert the number which is equal to K minus the current element. Works for non sorted array, btw.

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);
}
灯下孤影 2024-12-01 05:00:37
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]));
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]));
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文