-
问题描述
-
我的实现
我的想法是:不断比较当前平台与之前所有平台中的最长平台,若出现新的最长平台,即替换原来的最长平台(相应的标记,即最长平台的首元素地址,长度)。
#include<iostream>
using namespace std;
#define MAXSIZE 1000
int main()
{
int i=0, N=0, Elem[MAXSIZE];
cout << "输入数组元素(回车结束):";
while (cin>>Elem[N]){
N++;
if (cin.get() == '\n')
break;
}
int pS = 0, nS = 0, pLen = 1; /* pS标记之前平台中最长平台的首元素位置
pLen标记之前平台中最长平台的长度,每个平台长度至少为1,pLen初始化为1
nS标记当前平台的首元素位置 */
for (i = 1; i < N; i++) { //第二个元素开始向后扫描
if (Elem[i] == Elem[i - 1]) //相同元素属于同一平台
{
if (i-nS+1 > pLen) //(i-nS+1)为当前平台的扫描出的长度
{
// 若当前平台长度大于之前的最长平台长度
pS = nS; // pS重新标记
pLen = i - nS + 1; // pLen变化
}
}
else // 元素变化,进入下一平台, nS重新标记
nS = i;
}
cout << "数组中的最长平台为:";
for (i = pS; i < pS + pLen; i++)
cout << Elem[i] << ' ';
cout << endl;
return 0;
}
-
答案实现
答案巧妙地求解最大平台的长度,五体投地。
int long_plateau(int x[], int n)
{
int length = 1;
int i;
for (i = 1; i < n; i++)
{
if (x[i] == x[i - length])
length++;
}
return length;
}