題目大意:
給n個數, n<=100W,求一個連續子序列,這個子序列中沒有重復的數,問這個子序列最長是多少?
滑動窗口:當右端碰到有相同的數的時候,左端向右滑動一位數(圖片出自:https://www.cnblogs.com/aze-003/p/5113562.html)
使用STL的set函數,保存a[l~r]中的所有元素集合,r增大時判斷a[r+1]是否存在,若不存在則加1,否則l++繼續判斷
#include <iostream> #include <cstring> #include <set> #include <cstdio> #include <algorithm> #define N 1e7+10 using namespace std; int read() { int x=0,f=1;char c=getchar(); while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();} while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar(); return x*f; } int T,n,a[10000005]; int main() { T=read(); while(T--){ n=read(); for (int i=0;i<n;i++) a[i]=read(); set<int>s; int l=0,r=0,ans=0; while(r<n){ while(r<n&&!s.count(a[r])){ s.insert(a[r++]);} ans=max(r-l,ans); s.erase(a[l]); l++; } cout<<ans<<endl; } return 0; }
本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。