最长连续不重复子序列
最长连续不重复子序列
给定一个长度为n的整数序列,请找出最长的不包含重复数字的连续子序列,输出它的长度。
我们使用一个hash表和双指针动态维护双指针所夹区间内的信息。
i在前j在后。
每次i向前都使得hash[a[i]]++以此来增加序列中的元素。
接下来可能会出现冲突即[j, i]存在相同数字。
只要[j, i]存在相同数字即hash[a[i]] > 1 我们就让j++,同时使得hash[a[j]]--尝试移除序列前的元素使得冲突尽可能的被消减。
若执行完这个操作后仍有冲突则继续执行除非j > i。
另外每次找到不冲突序列后都更新res。
#include <bits/stdc++.h>
using namespace std;
const int N = 100010;
int a[N];
int main() {
int n ;
cin >> n;
int j = 0, res = 1;
unordered_map<int, int> s;
for(int i = 0;i < n; i++)cin >> a[i];
for(int i = 0;i < n; i++){
s[a[i]]++;
while(j <= i && s[a[i]] > 1)s[a[j++]]--;
res = max(res, i - j + 1);
}
cout << res << endl;
}