rt,我的代码:
#include<bits/stdc++.h>
using namespace std;
int a[100010];
bool vis[100010];
int main()
{
int n,ax=0;
scanf("%d",&n);
for(int i=1; i<=n; ++i) scanf("%d",&a[i]);
for(int i=1; i<=n; ++i)
{
if(!vis[i])
{
int l1=i-1,r1=i+1,l2=i-1,r2=i+1;
while(l1>=1 && (a[l1]==a[i] || a[l1]==a[i]+1)) --l1;
++l1;
while(r1<=n && (a[r1]==a[i] || a[r1]==a[i]+1)) ++r1;
--r1;
while(l2>=1 && (a[l2]==a[i] || a[l2]==a[i]-1)) --l2;
++l2;
while(r2<=n && (a[r2]==a[i] || a[r2]==a[i]-1)) ++r2;
--r2;
if(r1-l1+1<r2-l2+1)
{
ax=max(ax,r2-l2+1);
for(int j=l2; j<=r2; ++j) vis[j]=1;
}
else
{
ax=max(ax,r1-l1+1);
for(int j=l1; j<=r1; ++j) vis[j]=1;
}
}
}
printf("%d",ax);
return 0;
}
个人感觉是 O(n) 的,但是没法证明,而且同机房也有用 O(n2) 算法过的