其他分享
首页 > 其他分享> > [AcWIng 799] 最长连续不重复子序列

[AcWIng 799] 最长连续不重复子序列

作者:互联网

image


点击查看代码
#include<iostream>

using namespace std;
const int N = 1e5 + 10;
int a[N], s[N];

int main()
{
    int n, res = 0; 
    scanf("%d", &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 (s[a[i]] > 1) {
            s[a[j]] --;
            j ++;
        }
        res = max(res, i - j + 1);
    }
    printf("%d", res);
    return 0;
}

  1. j 指针代表的是 i 指针固定时,往左能到的最远位置,在这种意义下,j 是有单调性的,即 j 不会回溯,用反证法可知,如果 i 向右移动到 i',j 可以回溯到 j' 的位置,说明 [ j', i' ] 是满足条件的区间,那么其子区间也满足条件,[ j',i ] 是比 [ j,i ] 更长的区间,与 j 是往左能走到的最远位置矛盾。
  2. s[ i ] 用来记录数字 i 出现的次数,因为每次都是指针 i 的移动导致出现重复数字,所以每次 i 向右移动一位时,执行 while 语句判断是否出现重复数字,如果出现,就向右移动 j,直到把这个重复数字删去为止;

标签:移动,数字,int,res,重复子,799,++,指针,AcWIng
来源: https://www.cnblogs.com/wKingYu/p/16199298.html