Acwing 799. 最长连续不重复子序列(双指针)
地址:https://www.acwing.com/problem/content/description/801/
解析:
一:考虑暴力:
for(i=1;i<=n;i++)
for(j=1;j<=i;j++)
if(check())
maxx
二:对于每一个i,看它之前的是否符合条件。考虑双指针优化。一般的双指针,都是一个指针指当前,一个指开头
推导过程:
样例:
1 2 2 3 5
i = 1 , j = 1
j~i,无重复,i++
i = 2, j = 1
j~i,无重复,i++
i = 3 ,j =1
a[i]为重复数,所以整个j~i都不能算合法,所以只能j++,+到什么程度呢?直到a[i]的出现次数为1即可,所以a[j]的出现次数要一直减。
三:
代码:
#include<cstdio> #include<cstring> #include<vector> #include<set> #include<algorithm> #include<iostream> #include<vector> using namespace std; typedef long long ll; typedef unsigned long long ull; const int maxn=1e5+10,maxn2=31*maxn;//maxnᱦ const int P= 131; int n,a[maxn],v[maxn]; int main() { int n; cin>>n; int x; int maxx=0; for(int i=1;i<=n;i++) { cin>>a[i]; } int j=1; for(int i=1;i<=n;i++) { v[a[i]]++; while(j>=1&&v[a[i]]>1) { v[a[j]]--; j++; } maxx=max(maxx,i-j+1); // cout<<i<<"-"<<j<<endl; } cout<<maxx<<endl; }