【基础算法】最长连续不重复子序列

给定一个长度为n的整数序列,请找出最长的不包含重复数字的连续区间,输出它的长度。

输入格式

第一行包含整数n。

第二行包含n个整数(均在0~100000范围内),表示整数序列。

输出格式

共一行,包含一个整数,表示最长的不包含重复数字的连续子序列的长度。

数据范围

1n100000            1≤n≤100000

输入样例:

5
1 2 2 3 5

输出样例:

3

 题目代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;

const int N = 100010;
int s[N], a[N];
//储存某个数据在 区间[ij] 出现的次数                储存数据 

int main() {
    int n, res = 0;
    scanf("%d", &n);
    for (int i = 0;i < n;i++) scanf("%d", &a[i]);

    //双指针,j表示左边边界,i表示右边边界。
    for (int i = 0, j = 0;i < n;i++) {
        s[a[i]]++;//表示a[i]这个数在区间[i,j]中出现的次数+1

        while (s[a[i]] > 1) {//遇到重复数据j移动到i的位置,并把s[]数据清零。
            s[a[j]]--;
            j++;
        }

        res = max(res, i - j + 1);//每次循环更新最大长度。
    }

    printf("%d\n", res);
    return 0;
}

 

posted @ 2020-05-22 15:22  Vincent&  阅读(1056)  评论(0编辑  收藏  举报