给定一个排序的整数数组,我们怎样才能找到一对总和为K的整数?
e.g。 array = 1,3,5,6,0
,K = 6
,答案是1和5。
应尽量减少时间复杂性。
答案 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]));