题目描述
给定一个长度为n的整数序列,请找出最长的不包含重复数字的连续区间,输出它的长度。
输入格式
第一行包含整数n。
第二行包含n个整数(均在0~100000范围内),表示整数序列。
输出格式
共一行,包含一个整数,表示最长的不包含重复数字的连续子序列的长度。
数据范围
1≤n≤100000
样例
输入样例:
5
1 2 2 3 5
输出样例:
3
理解
题目要我们求最大长度,当然我们的一般是枚举循环取出有重复元素的子段,用双指针算法就是当i和j的两个索引值都在移动,给a[i]加上一个状态值,有一个我们就加一个,当他状态值大于1时,说明他有重复,就要移动j,重复该过程,选取以前的长度与现在长度的最大值。我们画一个简单图来理解:
算法1
(暴力枚举) $O(n^2)$
for(int i=0;i<n;i++){
for(int j=0;j<n;j++) {
if(check(i,j)){
ans=max(ans,i-j+1);
}
}
}
时间复杂度分析:$O(n)$
C++ 代码
#include<iostream>
using namespace std;
const int N=100010;
int a[N],s[N];
int n;
int main(){
cin>>n;
for(int i=0;i<n;i++)cin>>a[i];
int res=0;
for(int i=0,j=0;i<n;i++){
s[a[i]]++;
while(s[a[i]]>1){
s[a[j]]--;
j++;
}
res=max(res,i-j+1);
}
cout<<res<<endl;
return 0;
}