图解最长连续不重复子序列
当执行到这里时可以看到 i == 2
并且 s[a[i]] > 1
,所以执行 s[q[j++]]--
直到 s[a[i]] < 1
解释为什么这里 j++
是没有问题的呢
如果 s[q[i]] > 1
说明当前子序列中有重复的元素,并且元素和s[q[i]]
相同,我们需要通过j++
操作找到重复元素的位置。
j++
操作会同时减去当前非重复元素的次数,但是并不影响后面的连续子序列的计算,因为在每找到s[q[i]]
这个重复元素之前,所以的数都是在重复的子序列中的,并不符合我门要求的不重复子序列的性质,所以可以减去。
#include <iostream>
using namespace std;
const int N = 1e5 + 10;
int n;
int q[N], s[N];
int main()
{
scanf("%d", &n);
for (int i = 0; i < n; i++) scanf("%d", &q[i]);
int res = 0;
for (int i = 0, j = 0; i < n; i++)
{
s[q[i]] ++;
while (s[q[i]] > 1)
{
// 去重只有一个办法,就是收缩区间左端点,同时收缩时要保证j是小于i的
s[q[j++]]--;
}
res = max(res, i - j + 1);
}
cout << res << endl;
return 0;
}