题目:输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。
例如:A[]={1,2,3,4,5,6,7,8,9}, sum = 15,输出6,9.
思路:
因为数组是有序的,因此我们可设两个指针left,right,分别从头和从尾部遍历,若A[left] + A[right] > sum,则right–;若A[left] + A[right] < sum,则left++;否则我们就找到了所需的两个数字,分别为A[left]和A[right]。
void findTwoNumber(int A[],int n,int sum){
//A是递增数组
int left = 0;
int right = n - 1;
int target1;
int target2;
while(left < right){
if(A[left] + A[right] > sum){
right--;
}
else if(A[left] + A[right] < sum){
left++;
}
else{
target1 = A[left];
target2 = A[right];
break;
}
}
cout<<target1<<" "<<target2<<endl;
}