要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。例如输入数组1、2、4、7、11、15 和数字15。由于4+11=15,因此输出4 和11。
对于数组的任意两个数a、b,a+b = key时满足。我们可以取边a、b,既2个嵌套的for循环,但是这样复杂度是O(n^2);
for ( a++ )
for ( b++)
.......
但是在我们这个过程中,我们了解到,当a +b > key 的时候实际上就可以退出循环了;
当b最大的时候,a + b < key时 a 必须要 增加;
我们考虑a从最小开始,b从最大开始(可以从升序得到提示),由上面的性质,我们一定会得到结果;
#include <iostream>
#include <vector>
using namespace std;
typedef vector<int> VCI;
int main()
{
VCI vc;
vc.reserve(100);
int k = 0;
int key = 0;
cin >> key;
while ( !( cin >> k).eof() )
vc.push_back(k);
int i = 0;
int j = vc.size() - 1;
for (;i < j;)
{
if (vc[i] + vc[j] > key)
j --;
else if (vc[i] + vc[j] < key)
i ++;
else
break;
}
cout << i << "th + " << j << "th = " << key << endl;
return 0;
}