给定一个排序好的整数数组,如何找到一对整数使它们的和为K?
例如,数组
时间复杂度应该尽量小。
例如,数组
array = 1,3,5,6,10
,K = 6
,答案是1和5。时间复杂度应该尽量小。
array = 1,3,5,6,10
,K = 6
,答案是1和5。K/2
,然后移动一个变量a
到左边,另一个变量b
到右边,尝试找到一个解a+b=K
。K/2
的最大数字开始a
,从大于a
的最小数字开始b
。再次使用二分查找来查找a
,并让b
成为数组中的下一个元素。然后:
a+b = K
,则返回(a,b)
。a+b < K
,则将b
向右移动一个位置。a+b > K
,则将a
向左移动一个位置。a
,从数组末尾开始b
,然后执行以下操作:
a+b = K
,则返回(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]));