题意:
为了复习课本准备考试,J想用最少的时间看书,当然书很厚,但是有些知识点是重复的,为了能复习全部,并且还能看的页数最少,问最少看几页?
方法:
尺取法:在找到满足条件的情况下,继续向下移动知道结束。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <set>
#include <map>
using namespace std;
int a[1000005];
int main()
{
//freopen("in.txt","r",stdin);
int n;
while(scanf("%d",&n) != EOF) {
set<int>all;
for(int i = 0;i < n; i++) {
cin>>a[i];
all.insert(a[i]);
}
int n1 = all.size();
int s = 0,t = 0,num = 0,ans = n;
map<int,int>count;
while(true) {
while(t < n && num < n1) {
if(count[a[t++]]++ == 0) {
num++;
}
}
if(num < n1)
break;
ans = min(ans,t - s);
if(--count[a[s++]] == 0)
num--;
}
cout<<ans<<endl;
}
return 0;
}