题目一:输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,输出任意一对即可。
思路:定义两个指针,一个放在头部,一个放在尾部,因为是有序的。所以当两个指针所指的数的和大于s时,尾指针向前移,和小于s时,头指针向后移。
#include<iostream>
using namespace std;
bool FindNumbersWithSum(int data[], int length, int sum, int* num1, int* num2)
{
bool found = false;
if (length < 1 || num1 == NULL || num2 == NULL)
{
return found;
}
int behind = length - 1;
int ahead = 0;
while (behind > ahead)
{
long long curSum = data[ahead] + data[behind];
if (curSum == sum)
{
*num1 = data[ahead];
*num2 = data[behind];
found = true;
// cout << *num1 << " " << *num2 << endl;
break;
}
else if (curSum > sum)
{
behind--;
}
else
{
ahead++;
}
}
return found;
}
void test()
{
int data[] = {1, 2, 4, 7, 11};
int num1, num2;
bool result = FindNumbersWithSum(data, 5, 15, &num1, &num2);
if (result)
{
cout << num1 << " " << num2 << endl;
}
}
int main()
{
test();
return 0;
}