【问题描述】
为准备考试,Jessica开始阅读一本很厚的课本。要想通过考试,必须把课本中所有知识点都掌握。这本书总共有P页,第i页恰好有一个知识点a[i](每个知识点都有一个整数编号)。全书中同一个知识点可能会被多次提到,所以她希望通过阅读其中连续的一些页把所有的知识点都覆盖到。给定每页写到的知识点,请求出要阅读的最少页数。
【输入格式】
第一行一个整数P,表示书本的总页数。接下来的一行,包含P个整数,第i整数表示第i页包含的知识点的编号。
【输出格式】
一个整数,表示需要阅读的最少连续页数。
【输入样例】
5
1 8 8 8 1
【输出样例】
2
【数据范围】
1<=P<=10^6 , 1<=a[i]<=10^9
【来源】
POJ Monthly–2007.08.05, Jerry
思路:尺取法,输入时用set统计元素种类数,运用尺取法的同时用map记录窗口中的元素种类数。
/*
Name: Jessica's_Reading_Problem
Copyright: Twitter & Instagram @stevebieberjr
Author: @stevebieberjr
Date: 28/07/16 10:00
*/
#include<cstdio>
#include<set>
#include<map>
using namespace std;
int a[1000005];
set<int>s;
map<int,int>mp;
int main()
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
s.insert(a[i]);
}
int len=s.size();
int ans=n,p=0,q=0;
while(1)
{
while(q<n && mp.size()<len) mp[a[q++]]++;
if(mp.size()<len) break;
ans=min(ans,q-p);
mp[a[p]]--;
if(mp[a[p]]==0) mp.erase(a[p]);
p++;
}
printf("%d\n",ans);
return 0;
}