给定一个长度为 n 的整数序列,请找出最长的不包含重复的数的连续区间,输出它的长度。
输入格式
第一行包含整数 n。
第二行包含 n 个整数(均在 0∼10^5 范围内),表示整数序列。
输出格式
共一行,包含一个整数,表示最长的不包含重复的数的连续区间的长度。
数据范围
1≤n≤10^5
输入样例:
5
1 2 2 3 5
输出样例:
3
方法一:
思路:
- 假设已经读入前 b 个元素并且存入了数组
a
,并且对于[0, b]
内的元素,找到了以a[b]结尾的最长连续不重复子序列[f, b] - 读入第
b+1
个数据,记为 t- 若
a[f, b]
不包含t,则新的最长连续不重复子序列为[f, b+1] - 若
a[i] == t
,则从a[i+1, b+1]
重新记录最长子序列,因为如果后面的数据存在比[f, b]更长的子序列,那么肯定该子序列不会包含a[i]
- 若
做法:
- 双指针来维护该子序列
- 用一个set来记录窗口中元素的存在与否(因为数字取值范围是0~10^5,所以直接用下标代表key,内容代表value的数组q来代表set)
#include <bits/stdc++.h>
using namespace std;
int n;
int nums[100010], q[100010];
int main() {
int res = 0, t, f = 0, b = 0;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &t);
q[b++] = t;
if (nums[t]) {
do nums[q[f]] = 0; while (q[f++] != t);
}
nums[t] = 1;
res = max(res, b-f);
}
printf("%d", res);
}