给定一个长度为 n
的整数序列,请找出最长的不包含重复的数的连续区间,输出它的长度。
输入格式
第一行包含整数 n
。
第二行包含 n
个整数(均在 0∼105 范围内),表示整数序列。
输出格式
共一行,包含一个整数,表示最长的不包含重复的数的连续区间的长度。
数据范围
1≤n
≤10e5
输入样例:
5
1 2 2 3 5
输出样例:
3
思路
使用双指针方法
- i指针用来遍历序列
- 使用一个数组来记录重复数,遇到重复的则将j指针右移
#include <iostream>
using namespace std;
const int N = 100010;
int n;
int a[N], s[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]] ++;//使用s[]记录重复数
while (s[a[i]] > 1) {//如果有重复,遍历后--,然后将j向右移
s[a[j]]--;
j++;
}
res = max(res, i - j + 1);
}
cout << res << endl;
return 0;
}
使用下面的例子来执行算法的过程
exp
1 2 2 3 5
i
j
- i = 0,s[1] = 1,res = max(0,1) = 1
- i = 1,s[2] = 1,res = max(1,2) = 2
- I = 2,s[2] = 2 > 1,遇到重复的2了,s[1] = 0,j = 1,res = max(2,2) = 2;s[2] = 2>1,s[a[1]] – = s[2]-- ,s[2] = 1,j = 2,res = max(2,1) = 2
- i = 3,s[3] = 1,res = max(2,2) = 2
- i = 4,s[4] = 1,res = max(2,3) = 3 输出
参考
1.https://www.acwing.com/problem/content/801/