一,超时的思路(暴力)
利用滑动窗口算法枚举每个圆排列,再遍历每个排列,计算出每个圆排列的幸福值,每次把ans取max值来更新就好了。
时间复杂度:O(n^2)
二,正解
代码:
#include <bits/stdc++.h>
using namespace std;
long long n,t,a[10000001],ans;
int main()
{
scanf("%lld",&n);
for(int i = 0; i < n; i++)
{
scanf("%lld",&t);
if(t >= i) a[t - i]++;
else a[n - i + t]++;
}
for(int i = 0; i < n; i++) ans = max(ans,a[i] + a[(i + 1) % n] + a[(i - 1) % n]);
printf("%d",ans);
return 0;
}
时间复杂度:O(n)