C++题解 最长连续不重复子序列
C++题解 最长连续不重复子序列
题目描述
给定一个长度为 n 的整数序列,请找出最长的不包含重复的数的连续区间,输出它的长度。
输入格式
第一行包含整数 n。
第二行包含 n 个整数(均在 0∼105 范围内),表示整数序列。
输出格式
共一行,包含一个整数,表示最长的不包含重复的数的连续区间的长度。
数据范围
\(1≤n≤105\)
输入样例:
5
1 2 2 3 5
输出样例:
3
思想
暴力算法
暴力算法显然是最容易考虑的,我们使用两个循环 i , j 对整个数列进行遍历,很容易能得到答案。
但是对于大数列,\(O(n^2)\) 的复杂度很明显就会TLE了
双指针算法
我们使用两个指针 i, j ,令i指向数列下标较大的方向,j 指向数列下标较小的方向,我们每次移动 i, 就检查 \([i, j]\) 中是否存在重复数字,若重复,则移动 j 直到不重复。
计数排序与重复判断
在这里我们使用计数排序方法,对于每一个在 \([i, j]\) 中的数,我们令计数数组 b[n] 中 b[i] ++ ,我们每次要把 i 移动的时候,需要判断新加入区间的元素 a[i] 是否与区间存在元素重复,重复,我们就需要对 j 进行移动,移动时 b[j] -- ,直到 \([i,j]\) 中不重复。
代码实现
//
// Created by Owwkmidream on 2021/10/31.
//
#include "iostream"
using namespace std;
const int N = 10e5 + 7;
int a[N], b[N];
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
int n;
cin >> n;
for (int i = 0; i < n; ++i) {
cin >> a[i];
}
int res = 0;
for (int i = 0, j = 0; i < n; ++i) {
b[a[i]] ++;
while(b[a[i]] > 1) {
b[a[j]] --;
j ++;
}
res = max(res, i - j + 1);
}
cout << res;
return 0;
}

浙公网安备 33010602011771号