一.问题描述
给定一个长度为 n的整数序列,请找出最长的不包含重复的数的连续区间,输出它的长度。
输入格式
第一行包含整数 n。
第二行包含 n 个整数(均在 0∼10^5 范围内),表示整数序列。
输出格式
共一行,包含一个整数,表示最长的不包含重复的数的连续区间的长度。
数据范围
1≤n≤10^5
二.题目分析
有两个重点:最长以及不包含重复数的连续子序列。对于不包含重复数,可以通过设置一个数组记录每个数字出现的次数,大于一则重复,跳过;
设置双指针分别指向子序列的左右两端有重复时则跳过,两指针都指向下一个位置;当没有重复时,右指针依次右移,而左指针一直在重复的数右边第一位,这样即可保证长度最长。
每次得到当前一段最长长度,与前面一个相比较,及时更新最大值。
三.代码描述
#include<iostream>
using namespace std;
const int N=1e5+10;
int n;
int a[N],s[N];
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
int res=0;
for(int i=1,j=1;i<=n;i++)
{
s[a[i]]++;//记录每个数的重复次数
while(j<=i&&s[a[i]]>1) {//当右指针取到重复数,则当前已达到该段最大,左指针右移的同时别忘了减去次数,当j=i时再进行一次循环,方可进入下段最长子序列的查找
s[a[j]]--;
j++;
}
res=max(res,i-j+1);//更新
}
cout <<res<<endl;
return 0;
}