a[l~r]是可行解 则a[l+1~r]也是可行解 r不能增大时,只需将r右滑一位,不必减少r,即r在整个过程只增不减
每次要么增加r要么增加l 故增加次数为O(n)
判断是否出现用set()
#include<cstdio>
#include<iostream>
#include<set>
#include<algorithm>
const int maxn=1000000+5;
int a[maxn];
using namespace std;
int main(){
int T,n;
cin>>T;
while(T--){
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
int l=0,r=0,ans=0;
set<int> s;
while(r<n){ //
while(r<n&&!s.count(a[r])) { //r始终向右滑动 不能滑动时 删除一个最左端元素 进行外层循环 r继续从上层循环的位置尝试右滑
s.insert(a[r]);
r++;
}
ans=max(ans,r-l);//ans 维护最大值
s.erase(a[l]); //删除值a[l]
l++;
}
cout<<ans<<endl;
}
//system("pause");
return 0;
}
set()中的查找与删除时间都为log(n) 故时间复杂度为nlog(n)