原题链接:https://www.acwing.com/problem/content/description/801/
解题思路:双指针算法,利用s数组记录当前[j, i]序列里的数字出现的个数, 如果某次遍历发现新加入的a[i]累计出现的个数大于1,就让j向右移动,直到s[a[i]]<=1,之后记录当前序列的长度(i - j + 1), 筛选出最大的序列长度
#include<iostream>
using namespace std;
const int N = 1e5 + 10;
int a[N], s[N];
int n, ans;
int main()
{
cin>>n;
for(int i = 0; i < n; i ++ ){
cin>>a[i];
}
for(int i = 0, j = 0; i < n; i ++ ){
s[a[i]] ++ ;
while(s[a[i]] > 1){
s[a[j]] -- ;//a[j]元素出现的次数--
j ++ ;//j向右移动
}
ans = max(ans, i - j + 1);
}
cout<<ans<<endl;
return 0;
}