求助代码的时间复杂度
查看原帖
求助代码的时间复杂度
353688
王熙文楼主2021/8/18 20:30

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(n) 的,但是没法证明,而且同机房也有用 O(n2)O(n^2) 算法过的

2021/8/18 20:30
加载中...