题目一:在一个递增排序数组里,查找两个数,使他们的和正好为S,有多对输出一对即可。
方法一:先在数组中固定一个数,然后判和其余n-1个数的和是否等于S。时间复杂度 O(n^2);
方法二:我们先在数组中选择两个数(我们选择数组的第一个和最后一个),如果他们等于S,我们就找到了这两个数,如果小于S,我们将较小的数字换为后面的数字,因为排在后面的数字要大些。如果大于S,我们将较大的数字换为前面的数字,因为排在前面的数字要小些。 时间复杂度 O(n)
bool FindNumberWithSum( int data[] ,int length ,int sum,int * num1, int* num2)
{
bool found = false;
if(length<1 ||num1 == NULL || num2 =NULL )
return found;
int ahead =length-1;
int behind = 0;
while(ahead >behind)
{
long curSum=data[ahead]+data[behind];
if(curSum==sun)
{
*num1=data[behind];
*num2=data[ahead];
found=true;
break;
}else if(curSum >sum){
ahead--;
}else{
behind++;
}
return found;
}
题目二:如果查找三个数呢?
思想:我们可以将三个数的和拆分为两个数的和再加上一个数,也就是 num1+num2=sum-num3;如果我们用sum减去数组data里的每个数,我们将得到一个新的数组sumOfTwoNumber,新数组里元素的含义sum-num3;我们只需要在原数组中找两数,使其和等于 sumOfTwoNumber[i](这两个数不能为data[i]); 时间复杂度O(n^2);