题目:https://www.acwing.com/problem/content/801/
给定一个长度为 n 的整数序列,请找出最长的不包含重复的数的连续区间,输出它的长度。
这个题目是一个双指针经典题目,我们使用i和j两个指针计算最大长度,对于每一个i,由于[j, i - 1]是前一步得到的最长连续不重复子序列,所以如果[j, i]中有重复元素,一定是a[i],所以我们移动j,直到不存在重复元素,并更新最大长度。
对于区间i-j是否存在区间元素,我们在输入的时候,使用哈希mp计算元素a[i]的出现次数,即a[i]++,如果a[i]>1,就移动j。
#include<bits/stdc++.h>
#define int long long
typedef long long ll;
using namespace std;
const int N = 2e5 + 10;
const int mod = 998244353;
int mp[N];
void solve(){
int n;
cin>>n;
vector<int> a(n+1,0);
int ans = 0;
for (int i = 1,j = 1; i <= n; ++i) {
cin>>a[i];
mp[a[i]]++;//计算标记a[i]的出现次数
while (mp[a[i]] > 1){//移动j,直到不存在重复元素
--mp[a[j++]];//先减再移
}
ans = max(ans,i-j+1);
}
cout<<ans<<endl;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
int t = 1;
//cin>>t;
while(t--){
solve();
}
return 0 ;
}