Problem Description
为了准备考试,Jessica开始读一本很厚的课本。要想通过考试,必须把课本中所有的知识点都掌握。这本书总共有m页,第i页恰好有一个知识点ai(每个知识点都有一个整数编号)。全书中同一个知识点可能会被多次提到,所以她希望通过阅读其中连续的一些页把所有的知识点都覆盖到。给定每页写到的知识点,请求出要阅读的最少页数。
思路:
因为页数范围是1e9,不能开数组,所以用map
#include<cstdio>
#include<cstring>
#include<map>
using namespace std;
#define maxn 1000005
int a[maxn];
map<int, int> q;
int main()
{
int n;
while(~scanf("%d", &n))
{
q.clear();
int cnt = 0;
for(int i = 0; i < n; i++)
{
scanf("%d", &a[i]);
if(!q.count(a[i]))
q[a[i]] = cnt++;
}
q.clear();
int s = 0, num = 0;
int ans = n;
for(int i = 0; i < n; i++)
{
if(q[a[i]]++ == 0)
num++;
while(num == cnt)
{
ans = min(ans, i+1-s);
if(--q[a[s++]] == 0){
num--;
}
}
}
printf("%d\n", ans);
}
}