#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 尺取法经典
最新推荐文章于 2020-04-08 20:36:23 发布
本文介绍了一种使用尺取法求解最小覆盖区间的算法实现,通过维护一个滑动窗口来找到包含所有特定元素的最短连续子数组。该方法适用于需要高效处理大量数据并快速响应的应用场景。
395

被折叠的 条评论
为什么被折叠?



