题目:
输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。要求时间复杂度为O(N).
如果有多对数字的和等于输入的数字,输出任意一对即可。
例如输入数组1,2,4,7,11,15和数字15,由于4+11=15,因此输出4和11.
代码如下:
/*data[] 为有序数组,
length 为数组的长度
sum为用户输入的和
num1 为符合和等于sum的第一个数
num2 为第二个数*/
#include<iostream>
using namespace std;
bool FindTwoNumbersWithSum(int data[], unsigned int length, int sum, int& num1, int& num2)
{
bool found = false;
if (length < 1)
return found;
int begin = 0;
int end = length - 1;
while (end > begin)
{
long curSum = data[begin] + data[end];
if (curSum == sum)
{
num1 = data[begin];
num2 = data[end];
found = true;
break;
}
else if (curSum > sum)
end--;
else begin++;
}
return found;
}
int main()
{
int x, y;
int a[6] = { 1, 2, 4, 7, 11, 15 };
if (FindTwoNumbersWithSum(a, 6, 15, x, y))
{
cout << x << endl << y<< endl;
}
return 0;
}