思路
双指针(不知道怎么写,看了模板,模板好厉害,)
- 两个指针,变量i 和变量j 表示
- 思路就是每次增加一个元素,
- 然后找到重复元素,s[a[i]] > 1 表示有重复
- 然后去掉重复元素 s[a[i]] --;
- 然后我们移动前指针j j ++ 看以下i j之间的最大距离
代码
#include <iostream>
using namespace std;
const int N = 1e5 + 10;
int a[N], s[N];
int main()
{
int n, res = 0;
cin >> n;
for(int i = 0; i < n; i ++ ) scanf("%d", &a[i]);
for(int i = 0, j = 0; i < n; i ++ )
{
s[a[i]] ++; //每次输入一个数
while(j <= i && s[a[i]] > 1) // s[a[i]] > 1 表示出现了重复的数
{
s[a[j]] -- ; //把重复的数拿出去
j ++ ; //前指针后移
}
res = max(res, i - j + 1);
}
cout << res << endl;
return 0;
}