最长平台问题------2012年12月24日
2012-12-24 19:53
323 查看
问题描述:已知一个已经从小到大排序的数组,这个数组中的一个平台就是连续的一串值相同的元素,并且这一串元素不能再延伸。例如,在1,2,2,3,3,3,4,5,5,6中1,2.2,3.3.3,4,5.5,6都是平台。编写一个程序,接收一个数组,把这个数组中最长的平台找出来。在上面的例子中3.3.3就是该数组中最长的平台。
我的思路:用distance变量表示平台的长度,从数组target中的第i个数开始,比较target[i]与target[i+distance],如果相等,就distance++;如果不等,就将i+=distance.这样循环下去,知道i+distance==数组长度为止。这样的算法的时间复杂度是O(n),而且一般情况只会运行少于n的次数。代码如下:
我还在资料上查到另外一种技巧(思路与我的思路很类似):L是平台长度,从第i个数开始,循环比较target[i]与target[i-L]是否相等。如果相等,则L++;如果不等,则继续循环。代码如下:
如果您觉得我的文章对你有帮助,请推荐一下,非常感谢。
我的思路:用distance变量表示平台的长度,从数组target中的第i个数开始,比较target[i]与target[i+distance],如果相等,就distance++;如果不等,就将i+=distance.这样循环下去,知道i+distance==数组长度为止。这样的算法的时间复杂度是O(n),而且一般情况只会运行少于n的次数。代码如下:
#include <stdio.h> #define MAX 1000 void max_platform(int *target,int len); int main() { int test[]={1,2,2,3,3,3,4,5,5,6}; int len=sizeof(test)/sizeof(int); max_platform(test,len); return 0; } void max_platform(int *target,int len) { int distance=1; int result[MAX]={0}; result[0]=1; int i,j; int count=0; for(i=0;i+distance<len; ) { count++; if(target[i+distance]==target[i]) result[i]=++distance; else i+=distance; } //打印出最长的平台 for(i=0;i<len;i++) { if(result[i]==distance) { printf("distance: %d\n",distance); for(j=0;j<distance;j++) printf("%d ",result[i]); printf("\n"); } } printf("\n\ncount:%d\n",count); }
我还在资料上查到另外一种技巧(思路与我的思路很类似):L是平台长度,从第i个数开始,循环比较target[i]与target[i-L]是否相等。如果相等,则L++;如果不等,则继续循环。代码如下:
for(int i=1;i<size;i++) { if(x[i]==x[i-L]) L++; }
如果您觉得我的文章对你有帮助,请推荐一下,非常感谢。
相关文章推荐
- 最长平台问题------2012年12月24日
- 最长平台问题------2012年12月24日
- C/C++ 最长平台问题 算法
- 【串和序列处理 8】最长平台问题
- 最长平台问题(递归算法)------2012年12月25日
- 最长平台问题
- 1.最长平台问题
- 问题1:最长平台问题
- 最长平台问题
- 每日一小练——最长平台问题
- 最长平台问题 C实现
- 最长平台问题
- 最长平台问题(递归算法)------2012年12月25日
- 每日一小练——最长平台问题
- 最长平台问题(递归算法)------2012年12月25日
- 最长平台问题
- 最长字串及子序列问题
- 面试问题(做一个基础平台需要哪些人才)
- 发布到百度平台遇到的问题
- 算法作业6 动态规划 - 最长公共子串问题