算法导论2.3-7
2012-08-26 20:49
274 查看
方法1、
先排序,然后比较:
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。
先排序,然后比较:
int i=0,
j=n-1;
int b=0; while (i<j) { int k=s[i]+s[j]; if (k==x) b=1,break; else if (k<x) i++; else j--; } if (b) printf("Y\n"); 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。
相关文章推荐
- 【算法导论】 2.3合并排序
- 「算法导论」:课后习题2.3-7求集合S中是否有两个元素的和为X
- 归并排序 (不采用哨兵) 算法导论2.3-2答案
- 插入排序的递归实现和二分查找递归实现,算法导论2.3-4和2.3-5
- 算法导论2.3-5二分查找
- 算法导论 2.3-5
- 【算法导论】第三版课后习题*2.3-7
- 算法导论2.3-5二分法查找问题
- 算法导论2.3-6
- 从头看算法导论 习题2.3-7 深入分析
- 算法导论 练习题 2.3-6
- 算法导论2.3-7
- 算法导论2.3-7习题
- 170916_算法导论学习(四)_2.3 设计算法_练习
- 编程之美 2.12 快速寻找满足条件的两个数 解法三证明 (算法导论 第二版 2.3-7 在n个元素的集合S中找到两个和为x的元素)
- <算法导论>第二章 2.3设计算法
- 170915_算法导论学习(三)_2.3 设计算法
- 算法导论 2.3-3
- 算法导论学习之插入排序+合并排序
- 算法导论14.3 -区间树