最长平台问题

来源:互联网 发布:巨人网络2017业绩 编辑:程序博客网 时间:2024/04/27 19:01

           该问题出自《C语言名题精选百则技巧篇》。大意是:找出一段有序数字中,找出最长而且连续的数字。比如在1,2,2,3,3,3,4,5,5,6中最长平台即为3,长度也是3。

           我的代码如下:

#include <stdio.h>#include <conio.h>int main(){int i=0,L=0;int result;int x[]={1,2,2,3,3,3,4,5,5,5,5,6};  //in orderresult=x[0];int size=sizeof(x)/sizeof(int);  //the number of the integer arrayfor(i=0;i+L<size;i++){for(;;L++){if(x[i]==x[i+L])result=i;elsebreak;}}printf("%d",x[result]);getch();}



          我的想法非常朴素:从第一个数开始,L初始为0,遍历寻找第一个数的长度。例子中第一个数长度为1,进入第二个数,得L=2。以此类推,在O(n2)的时间复杂度内得到结果。

         但是书上的算法代码更少,时间复杂度却更低。

         书中代码如下:

#include <stdio.h>#include <conio.h>int main(){int x[]={1,2,2,3,3,3,4,5,5,6};  //in orderint size=sizeof(x)/sizeof(int);int result=0;int L=1;for(int i=1;i<size;i++){if(x[i]==x[i-L]){result=i;L++;}}printf("%d:   length:%d",x[result],L);getch();}

           这样就可以每个元素只比较一次,不用像我的算法一样来回比较,也凭借着L避免了很多不必要的比较,效率非常高,时间复杂度为O(n)。

           总结:算法的学习,思考是关键。


           参考文献:《C语言名题精选百则:技巧篇》       D.Gries.The Science of Programming,Springer-Verlag,1981


原创粉丝点击