第一种用set,比较简单易懂。
第二种的map,相当于就是用map临时储存某个元素的上一个元素的位置,然后构造了一个last数组。根据last数组,只要last[i]<l,即在一个子序列中,右边的元素的上一个位置在L之外,就可以向右拓展。
#include<bits/stdc++.h>
using namespace std;
//solution 1
int main(void){
int t;
cin>>t;
while (t--){
int n;
cin>>n;
int a[n];
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
set<int>s;
int left=0,right=0,ans=0;
while(right<n){
while(right<n&&!s.count(a[right])){
s.insert(a[right++]);
}
ans=max(ans,right-left);
s.erase(a[left++]);
}
cout<<ans<<endl;
}
}
//solution 2
map <int,int> mp;
const int mxn = 1000000+5;
int last[mxn],a[mxn];
int main(void){
int t;
scanf("%d",&t);
while(t--){
int n;
scanf("%d",&n);
mp.clear();
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
if(!mp.count(a[i])){
last[i]=-1;
}
else{
last[i]=mp[a[i]];
}
mp[a[i]]=i;
}
int l=0,r=0,ans=0;
while(r<n){
while(r<n&&last[r]<l){
r++;
}
ans=max(ans,r-l);
l++;
}
printf("%d\n",ans);
}
return 0;
}