可以用set或者map来实现
1.用set,把每个唯一元素进入集合,扩展右边界,直到发现有不唯一的元素,从左边开始删除元素,直到集合中无该元素
#include<bits/stdc++.h>
using namespace std;
int a[1000000];
set<int> s;
int main(){
int n;
scanf("%d",&n);
while(n--){
int count;
scanf("%d",&count);
for(int i=0;i<count;i++)
scanf("%d",&a[i]);
int r=0,l=0,ans=0;
s.clear();
set<int>::iterator it=s.begin();
while(r<count){
while(r<count && s.find(a[r])==s.end())
s.insert(a[r++]);
ans=max(ans,r-l);
s.erase(a[l++]);
}
printf("%d\n",ans);
}
}
2.用map实现:
用map记录每个数对应的数组下标,用last[i]记录数组下标为i时,之前有没有和他一样的元素,若有,则使last[i]等于那个元素的下标,若没有,使last[i]=-1,以便后续移动左边界。
#include<bits/stdc++.h>
using namespace std;
int last[1000005];
map<int,int> cur;
int a[1000005];
int main(){
int n;
scanf("%d",&n);
int count;
while(n--){
cur.clear();
scanf("%d",&count);
for(int i=0;i<count;i++){
scanf("%d",&a[i]);
if(cur.find(a[i])==cur.end()) //如果没找到
last[i]=-1;
else //如果找到了
last[i]=cur[a[i]];
cur[a[i]]=i;
}
int l=0,r=0,ans=0;
while(r<count){
while(r<count && last[r]<l) r++;
ans=max(ans,r-l);
l++;
}
printf("%d\n",ans);
}
}