【快慢指针】 最长连续不重复子序列

传送门

题意

给定长度为\(n\)的序列\(a\),求连续的没有重复元素的最长子序列的长度

数据范围

\(1\leq n\leq 100000\)
\(1 \leq a_{i} \leq 100000\)

题解

双指针,保证\(j<i\) ,用一个数组记录当前值的出现个数,
因为是连续的,当 \(a[ i ]\)出现两次的时候,\(j\)一直向前,并且映射的次数减1,直到 \(i\)对应的值的出现次数为1时候,取最大记录即可

Code

#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,n) for(int i=a;i<n;i++)
#define per(i,a,n) for(int i=n-1;i>=a;i--)
const int N=1e5+10;
int a[N],f[N];
int n;
int main(){
    scanf("%d",&n);
    rep(i,0,n) scanf("%d",&a[i]);
    int ans=-1;
    for(int i=0,j=0;j<n;j++){
        f[a[j]]++;
        while(i<j && f[a[j]] >1)
            f[a[i++]]--;
        ans=max(ans,j-i+1);
    }
    printf("%d\n",ans);
}

posted @ 2020-05-28 18:14  Hyx'  阅读(185)  评论(0)    收藏  举报