您的位置:首页 > 其它

最长平台问题------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的次数。代码如下:

#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++;
}


如果您觉得我的文章对你有帮助,请推荐一下,非常感谢。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: