[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,直到把这个重复数字删去为止;
posted @   wKingYu  阅读(24)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
欢迎阅读『[AcWIng 799] 最长连续不重复子序列』
点击右上角即可分享
微信分享提示