#include <iostream>
#include <algorithm>
#include <set>
#include <cstdio>
#include <map>
using namespace std;
const int M=101000;
int a[M],p,n;
set<int> all;
int main()
{
int ans=M;
cin>>p;
for(int i=0;i<p;i++)
{
scanf("%d",&a[i]);
all.insert(a[i]);
}
n=all.size();
int s=0,t=0,num=0;//尺取法运用条件 : As..At-1成立 若 As+1..At'-1成立 则 t'>=t
map<int, int> Count; // 知识点->出现次数的映射
while(1)
{
while(t<p && num < n)
{
if(Count[a[t]]++== 0) //新的知识点出现
{
num++;
}
t++;
}
if(num<n) break;
ans=min(ans,t-s);
if(--Count[a[s++]]==0) //删除掉As后某个知识点变为0
{
num--;
}
}
cout<<ans<<endl;
return 0;
}
poj 3320 尺取法经典
最新推荐文章于 2021-10-14 20:07:21 发布