JSK要看完一本书,这本书有P页,里面每一页有一个知识点,求最少连续的页数可以看完所有的知识点。
由于又是连续的区间是否符合条件这种问题,还是尺取法,依次寻找合适的区间。
这次没有考虑周全,结束条件还是设置的e到最后,其实e到最后也可以的,只要无法找到下一个合法区间,即total无法达到tn(知识点数)
#include<stdio.h>
#include<string.h>
#include<map>
#include<set>
using namespace std;
const int INF=0x3f3f3f3f;
int num[1000001];
int i,j,k;
int tn;
int n;
int main()
{
set<int> all;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&num[i]);
all.insert(num[i]);
}
tn=all.size();
map<int,int> count;
int s,e;
s=e=0;
int total=0;
int min=INF;
while(1)
{
while(e<n&&total<tn)//尾部前移寻找下一个合法区间
{
if(count[num[e++]]++==0)
{
total++;
}
}
if(total<tn)//判定是否合法
break;
min=min>e-s?e-s:min;//更新最值
if(--count[num[s++]]==0)//头部前移
{
total--;
}
}
printf("%d\n",min);
}