题目 给定一个长度为 $n$ 的整数序列,请找出最长的不包含重复的数的连续区间,输出它的长度。 输入格式第一行包含整数 $n$。 第二行包含 $n$ 个整数(均在 0∼105 范围内),表示整
          
题目
给定一个长度为 $n$ 的整数序列,请找出最长的不包含重复的数的连续区间,输出它的长度。
输入格式 第一行包含整数 $n$。
第二行包含 $n$ 个整数(均在 0∼105 范围内),表示整数序列。
输出格式 共一行,包含一个整数,表示最长的不包含重复的数的连续区间的长度。
数据范围 $1≤n≤10^5$
输入样例:
5
1 2 2 3 5
输出样例:
3
思路
步骤如下:
- 遍历存放的整个数组,$l、r$为左右指针
 a[i]出现次数b[a[i]] + 1- 存在重复值时左指针 $l$ 右移且对应的值次数减 $1$
 - 更新最大值 
res = max(res, r - l + 1) 
代码
#include <iostream>
using namespace std;
const int N = 100010;
int a[N], b[N];  // a存储数值,b存储第i个数出现的次数
int main()
{
    int n;
    scanf("%d", &n);
    for (int i = 0; i < n; i ++ ) scanf("%d", &a[i]);
    
    int res = 0;
    for (int l = 0, r = 0; r < n; r ++ )
    {
        b[a[r]] ++ ;  // 对应值出现次数加1
        while (b[a[r]] > 1)  // 存在重复值则循环
        {
            b[a[l ++ ]] -- ;  // l右移且对应的值出现次数减1
        }
        res = max(res, r - l + 1);  // 更新最大长度
    }
    
    printf("%d", res);
    
    return 0;
}
            
        
        
        【转自:东台网页开发公司 http://www.1234xp.com/dongtai.html 提供,感恩】
 