算法导论2.3-7

方法1、

先排序,然后比较:

 1 int i=0,
j=n-1;
 2 int b=0;
 3 while (i<j)
 4 {
 5     int k=s[i]+s[j];
 6     if (k==x) b=1,break;
 7     else if (k<x) i++;
 8     else j--;
 9 }
10 if (b) printf("Y\n");
11 else printf("N\n");

nlgn+n=nlgn,即可以在规定时间内完成。

方法2、

先排序,时间复杂度为:o(nlgn)

S={y,y<x,y∈S},有序数组。

S'={z:z=x-y,y∈S},显然S'也是一个有序数组。

然后,合并S、S’ 数组,如果存在两个连续的相等值,也就是y1,y1,...,y2,y2  且y1+y2 = x,那么集合S中就存在两个数的和为X。

那么,就存在y1+y2 = x,满足条件。

为什么要存在两个连续的相等值呢?

-------因为数是对称的,如果存在y1,使得y1=x-y2,那么也有y2 =x-y1存在。

o(nlgn) +o(n) = o(nlgn)

------------------------------------------------------------------------------


同样道理,找三个数之和也可以在n^2时间内完成。
sum=a[i]+b[i]+c[i];
等价找两个数其和为s=sum-a[i];
共有n个,每个查找为线性时间n;
nlgn+n^2=n^2。 

转载于:https://www.cnblogs.com/xuxu8511/archive/2012/08/26/2657685.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值