题目描述
给定一个长度为 n 的整数序列,请找出最长的不包含重复的数的连续区间,输出它的长度。
输入描述
第一行包含整数 n(1≤n≤105)。
第二行包含 n 个整数(均在 0∼105 范围内),表示整数序列。
输出描述
共一行,包含一个整数,表示最长的不包含重复的数的连续区间的长度。
样例输入
5 1 2 2 3 5
样例输出
3
分析
使用两个指针 i 和 j 来维护一个只包含不重复元素的滑动窗口。指针 i 指向窗口的开始位置,j 指向窗口 结束位置。我们还需要使用一个辅助数组 s 来存储窗口中每个元素出现 次数。元素个数=末项-首项+1。
#include<iostream>
using namespace std;
const int N=100001;
int arr[N],s[N];
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++){
cin>>arr[i];
}
int res=0;
for(int i=0,j=0;i<n;i++){
s[arr[i]]++;
//从左到右遍历数组中的每个元素 q[i]。对于每个元素 q[i], 我们在 s[q[i]] 中将其出现次数加一。
while(j<i&&s[arr[i]]>1){
//检查 s[q[i]] 是否大于一, 这意味着 q[i] 在窗口中已经出现过了
s[arr[j++]]--;
//缩小窗口, 将 i 向前移动,直到 s[q[i]] 再次变为一
}
res=max(res,i-j+1);
}
cout<<res;
return 0;
}