UVa 11572 - Unique Snowflakes (set+滑動窗口思想)


題目大意:

給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;
}

 


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
  © 2014-2022 ITdaan.com 联系我们: