题目描述
给定一个长度为n的整数序列,请找出最长的不包含重复的数的连续区间,输出它的长度。
输入格式
第一行包含整数n。
第二行包含n个整数(均在0~100000范围内),表示整数序列。
输出格式
共一行,包含一个整数,表示最长的不包含重复的数的连续区间的长度。
数据范围
$1≤n≤100000$
输入样例:
5
1 2 2 3 5
输出样例:
3
思路
本题主要是双指针算法
双指针算法的核心思想就是把$O(n^2)$的代码优化成$O(n)$的
在做这种双指针算法的题目时我们可以先想一个朴素做法
然后再进行优化
朴素算法很好想
我们就直接来看一下优化之后的算法
(在讲这题的时候个人认为有一丢丢的乱,所以如果哪里有错误还请大佬指出)
直接拿输入样例举例子
一开始我们的i,j都在最左边
此时,i,j之间只有1一个数,符合要求,所以i往右移动一位
此时,i,j之间只有1、2,没有重复,符合要求,所以i往右移动一位
此时,i,j之间有1、2、2,2重复了,所以现在要移动j
此时,i,j之间有2、2,2还是重复了,所以现在要继续移动j
此时,i、j都指向2,符合要求,接下来继续移动i
此时,i,j之间只有2、3,没有重复,符合要求,所以i往右移动一位
此时,i,j之间只有2、3、5,没有重复,符合要求,整个数组已经遍历完,
代码
#include<iostream>
using namespace std;
const int N = 100010;
int a[N],s[N];
int res=0;
int main()
{
int n;
cin >> n ;
for (int i = 0; i < n; i ++)
{
cin >> a[i];
}
int j=0;
for (int i = 0; i < n;i ++)
{
s[a[i]] ++;
while(s[a[i]]>1)
{
s[a[j]]--;
j++;
}
res = max(res,i - j + 1);
}
cout << res;
return 0;
}