2018-2-7
与poj3061类似,直接使用尺取法即可,这里使用STL里面的map求解更为方便,可以直接得到每个知识点出现的次数,继而便于进行加一减一操作。
#include<iostream>
#include<cstdio>
#include<map>
using namespace std;
const int N = 1000000;
int x[N+1];
int p,cnt;
map<int,int>mp;
void res(){
int i=1,j=1,res=N;
for (i=1;i<=p;i++){
while (mp.size()!=cnt&&j<=p){
if (mp.count(x[j])){
mp[x[j]]++;
}else{
mp[x[j]]=1;
}
j++;
}
if (mp.size()!=cnt) break;
res=min(res,j-i);
if (mp[x[i]]==1){
mp.erase(x[i]);
}else{
mp[x[i]]--;
}
}
cout<<res<<endl;
}
int main(){
while (cin>>p){
mp.clear();
for (int i=1;i<=p;i++){
scanf ("%d",&x[i]);
if (mp.count(x[i])){
mp[x[i]]++;
}else{
mp[x[i]]=1;
}
}
cnt=mp.size();
mp.clear();
res();
}
return 0;
}