输入一个长度为n n<=10 6 的序列A 找到一个尽量长的连续子序列 使得该序列中没有相同的元素
用滑动窗口法 时间复杂度n 好神奇
此题非常经典
map 410ms
#include<bits/stdc++.h> using namespace std; #define N 100000000 long a[N]; int main() { int cas; cin>>cas; while(cas--) { int n;cin>>n; for(int i=1;i<=n;i++) scanf("%ld",&a[i]); map<long,int>mp; mp.clear(); int maxx=0; int j=1; for(int i=1;i<=n;i++) { int ok=1; while(ok&&j<=n) { ok=0; if(!mp[ a[j] ]) { maxx=max(maxx,j-i+1); mp[ a[j] ]++; ok=1; } j++; } j--; mp[ a[i] ]--; } printf("%d ",maxx); } }
LRJ 的代码只用240!。。诶
注意set的erase用法
#include<bits/stdc++.h> using namespace std; #define N 100000000 int a[N]; int main() { int cas;cin>>cas; while(cas--) { int n;cin>>n; for(int i=0;i<n;i++)scanf("%d",&a[i]); set<int>s; int L=0,R=0; int ans=0; while(R<n) { while(R<n&&!s.count(a[R]))s.insert(a[R++]); ans=max(ans,R-L); s.erase( a[L++]); } printf("%d ",ans); } }