030day(通过例题了解程序时间复杂度)

来源:互联网 发布:mac放大窗口的快捷键 编辑:程序博客网 时间:2024/06/01 21:33

172210704111- 陈国佳总结《2017年11月9日》[连续030天]

标题:通过例题了解程序时间复杂度;

内容:A. 

a.输入n(n<=100,000)个整数,找出其中的两个数,它们之和等于整数m(假定肯定有解)。题中所有整数都能用int表示:

思路:

解法1:两重循环,枚举,复杂度是O(n^2);大约为100亿,超时!

解法2:

1)将数组排序,复杂度是O(n*log(n))底数是2;

2)  对数组中的每个元素a[i],在数组中二分查找m-a[i]。复杂度是log(n),最坏查找n-2,这部分的复杂度也是O(n*log(n)) ;


解法3:

1)将数组排序,复杂度是O(n*log(n));

2)  查找的时候,设置两个变量i和j,i初值说0,j初值是n-1.看a[i]+a[j],如果大于m,就让j-1,如果小于m,就让i+1;,直至a[i]+a[j]=m;

总复杂度说O(n*log(n));

b.农夫John建造了一座长畜栏,它包括N(2<=n<=100,000)个隔间,这些小隔间的位置为x(0),.....,x(n-1)(0<=x(i)<=1,000,000,000)

John的C(2<=C<=N)头牛每头到一个隔间。使任意两头牛之间的最小距离经可能大,则最大的最小距离说多少?(百练 2456)

总时间限制: 
1000ms 
内存限制: 
65536kB

思路:

解法1:

1)排序;

2)把第一头放在x(0);

3)若第k头牛放在x(i), 则找到x(i+1)到x(n-1)中第一个位于[x(i)+D,1,000,000,000]中的x(j),第k+1头牛放在x(j)。找不到,就D=D-1,转2)重复;

复杂度  1,000,000,000/C*N,即 1,000,000,000,超时!

解法2:

1)排序;

2)在[L,R]内用二分法尝试“最大最近距离”D=(L+R)/2(L,R初值为[1,  1,000,000,000/C])

若D可行,则记住该D,然后在新[L,R]中继续尝试(L=D+1)

若 D不可行,则在新[L,R]中继续尝试(R=D-1)

复杂度 log(1,000,000,000/C)*N;


明日计划:学习STL排序算法sort;

原创粉丝点击