题目:输入一个已经按升序排序过的数组和一个数字,
在数组中查找两个数,使得它们的和正好是输入的那个数字。
要求时间复杂度是O(n)。
如果有多对数字的和等于输入的数字,输出任意一对即可。
例如输入数组1、2、4、7、11、15和数字15。由于4+11=15,因此输出4和11。
在数组中查找两个数,使得它们的和正好是输入的那个数字。
要求时间复杂度是O(n)。
代码如下:
#include<iostream>
using namespace std;
/*
start往上增长,end往下递减。
1.出现data[start] + data[end] > sum的情况是建立在data[start - 1] + data[end] < sum的情况,不包括初始值,
所以在此基础上必定为 data[start - 1] + data[end - 1] < sum,所以data[start] + data[end] == sum才有可能
2.出现data[start] + data[end] < sum的情况,如果start不变,小于end的下标的数据都不能满足,只能start++
3.
*/
void FindtwoofSum(int sum,int *data,int length)
{
int start = 0;
int end = length - 1;
int temp;
while(start < end)
{
temp = data[start] + data[end];
if(temp == sum)
{
cout<<"The sum consist of "<<data[start]<<" + "<<data[end]<<endl;
return;
}
else if(temp > sum)
end--;
else
start++;
}
cout<<"the numbers are not exist!!"<<endl;
}
int main()
{
int data[] = {1,2,4,7,11,15};
FindtwoofSum(15,data,6);
return 0;
}