在数组中查找与给定和相加的一对数字

问:给定一个未排序的正整数数组,是否可以从该数组中找到一对求和为给定和的整数

约束:这应该在O(n)和就地完成(没有任何外部存储,如数组、哈希映射)(您可以使用额外的变量/指针)

如果这是不可能的,有没有证据可以证明这一点

如果你有一个排序数组,你可以通过向中间移动两个指针在O(n)中找到这样一对

i=0
j=n-1
while(i<j){
如果(a[i]+a[j]==目标)返回(i,j);
如果(a[i]+a[j]<目标)i+=1;
如果(a[i]+a[j]>目标)j-=1;
}
未找到返回;

如果您对数字的大小有一个界限(或者如果数组的第一个位置已经排序),则可以进行O(N)排序。即使这样,对数n因子还是非常小,我不想费心去刮去它

证明:

如果有一个解决方案(i*,j*),在不丧失一般性的情况下,假设ij到达j*之前到达i*。因为对于j*j之间的所有j',我们知道a[j']>a[j*]我们可以推断出a[i]+a[j']>a[i*]+a[j*]=target,因此,算法的所有后续步骤将导致j减小,直到其达到j*(或相等值),而不会给i一个向前推进的机会,并“错过”解决方案

另一个方向的解释是类似的

发表评论