问题描述:已知一个已经从小到大排序的数组,这个数组中的一个平台就是连续的一串值相同的元素,并且这一串元素不能再延伸。例如,在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的次数。代码如下:
- #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++;
- }
如果您觉得我的文章对你有帮助,请顶一下,非常感谢。
阅读(947) | 评论(0) | 转发(0) |