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

 

posted @ 2020-11-13 13:42  liyexin  阅读(117)  评论(0编辑  收藏  举报