题目:输入一个递增序列的数组S,在数组中查找两个数使得他们的和为s,如果有多对数字的和为s,输出任意一对即可。
思路:我们先在数组中选择两个数,如果他们的和等于s,这两个数即为我们所找的两个数,如果这两个数的和小于s,我们希望选择的两个数更大一点,由于数组是按照从小到大排序的,我们可以考虑选择较小的数字后面的数字,因为后面的数字较大一些,因此他们的和也会较大一点,这样我们就有可能找到两个和为s的数字了,同样当两个数字的和大于给定数字的时候,我们看了一考虑选择较大数字前面的数字。
比如:我们以数组{1,2,4,7,11,15}以及期待的和15为例,首先定义两个指针,第一个指针指向数组的最小的元素1,第二个指针指向数组的最带的元素15,他们的和为16>15,因此我们把第二个指针向前移动一位得数字11,此时他们的和为12<15,这时我们把第一个指针向后移动一位得到数字2,他们的和为13<15,此时再把第一个指针向后移动一位得到数字4此时他们的和为15,这正是我们期待的结果。
参考代码如下:
#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 tail = length = 1;
int head = 0;
while(head < tail)
{
int nSum = data[tail] + data[head];
if(nSum == sum)
{
*num1 = data[head];
*num2 = data[tail];
found = true;
break;
}else if(nSum > sum)
{
tail--;
}
else{
head++;
}
}
return found;
}
int main()
{
int a,b;
int data[] = {1,2,4,7,11,15};
bool flag = findNumbersWithSum(data,6,15,&a,&b);
if(flag)
{
cout<<a<<" "<<b<<endl;
}
return 0;
}