双指针算法.最长连续不重复子序列AcWing.799
题目:

双指针+桶优化 code:
#include<bits/stdc++.h> using namespace std; const int N=1e5+5; int tong[N],a[N],n; int read() { int f=1,ans=0;char c=getchar(); while(c>'9'||c<'0')if(c=='-'){f*=-1;c=getchar();} while(c>='0'&&c<='9'){ ans=(ans<<3)+(ans<<1)+c-'0'; c=getchar(); } return f*ans; } int main() { n=read(); for(int i=1;i<=n;i++)a[i]=read(); int l=1,ans=0; for(int r=1;r<=n;r++) { tong[a[r]]++; while(tong[a[r]]>1)tong[a[l++]]--; ans=max(ans,r-l+1); } cout<<ans; return 0; }
二分法+桶 code:
#include<bits/stdc++.h> using namespace std; const int N=1e5+5; int a[N],n,tong[N]; int read() { int f=1,ans=0;char c=getchar(); while(c>'9'||c<'0')if(c=='-'){f*=-1;c=getchar();} while(c>='0'&&c<='9'){ ans=(ans<<3)+(ans<<1)+c-'0'; c=getchar(); } return f*ans; } bool check(int mid) { memset(tong,0,sizeof tong); int j=1; for(int i=1;i<=n;i++) { ++tong[a[i]]; while(tong[a[i]]>1)tong[a[j++]]--; if(i-j+1>=mid)return 1; } return 0; } int main() { n=read(); for(int i=1;i<=n;i++)a[i]=read(); int l=2,r=n; while(l<r) { int mid=l+r+1>>1; if(check(mid))l=mid; else r=mid-1; } cout<<l<<endl; return 0; }
浙公网安备 33010602011771号