我应该迭代第一个数组并在另一个数组上进行二进制搜索吗? 谢谢:))
答案 0 :(得分:6)
没有!
两个数组都是有序的,因此您可以执行以下操作:
itA
A
itB
B
*itA + *itB
。如果该值等于K
,则返回两个索引。如果该值小于K
,请增加itA
。否则,减少itB
。当您浏览两个数组时,您将在线性时间内完成。
答案 1 :(得分:1)
因为,对于每个A [i],只能有一个B [j],你可以找到O(n + m)复杂度的解。您可以依赖以下事实:如果(A [i1] B [j1])和(A [i2] B [i2])都是正确的对,并且i1小于i2则j1必须大于j2。希望这会有所帮助。
答案 2 :(得分:0)
我不知道它是否有帮助,这只是一个想法。循环A线性和二进制搜索B,但向后做A。这可能会给你一个更好的最佳情况,因为它能够在A的每一步中排除B的某些部分。
如果你知道A [i]需要说B [42]来解决K,你就会知道A [i-1]需要至少B [43]或更高。
编辑:我还想补充一点,如果B的元素数量少于A,则将其转为并线性地做B线。
答案 3 :(得分:0)
C ++中可能的实现如下:
#include <iostream>
int main()
{
int A[]={1,2,3,6,7,8,9};
int B[]={0,2,4,5,6,7,8,12};
int K=9;
int sizeB=sizeof B/sizeof(int);
int sizeA=sizeof A/sizeof(int);
int i=0;
int j=sizeB-1;
while(i<sizeA && j>=0)
{
if ((A[i]+B[j])==K){
std::cout << i<<","<<j<< std::endl;
i++;
j--;
}
else if((A[i]+B[j])<K){
i++;
}
else{
j--;
}
}
return 0;
}