面试题41_1 和为S的数

题目一:在一个递增排序数组里,查找两个数,使他们的和正好为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);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值