给定一个排序的整数数组,我们如何找到一对和为 K 的整数?
例如array = 1,3,5,6,10
, K = 6
, 答案是 1 和 5。
时间复杂度应该最小化。
给定一个排序的整数数组,我们如何找到一对和为 K 的整数?
例如array = 1,3,5,6,10
, K = 6
, 答案是 1 和 5。
时间复杂度应该最小化。
你可能想看看这篇博文:
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
向左移动一位。这可能更快。
有一个线性 (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);
}
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]));