双指针算法.最长连续不重复子序列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;
}

 

posted @ 2020-12-18 15:05  纸上的彩虹  阅读(172)  评论(0)    收藏  举报