题意:求最少的连续读的页数能读到所有的知识点
思路:尺取法,把所有的知识点的编号放到set里求出知识点的个数,在尺取过程中用map记录当前以学知识点的个数。
#include <map>
#include <set>
#include <stdio.h>
#include <algorithm>
#define maxn 1000005
using namespace std;
int a[maxn];
int main(void)
{
set<int> st;
int n,i,num,s,t,res,cnt;
num = 0;
scanf("%d",&n);
for(i = 0; i < n; i++) {
scanf("%d",&a[i]);
st.insert(a[i]);
}
//知识点种类的数目
num = st.size();
map<int,int> mp;
s = t = 0;
cnt = 0;
res = n;
while(1) {
while(t < n && cnt < num) {
mp[a[t]]++;
//mp[a[t]]为1说明a[t]是新读的知识点
if(mp[a[t]] == 1)
cnt++;
t++;
}
//cnt < num说明t >= n,所以break
if(cnt < num)
break;
res = min(res,t - s);
mp[a[s]]--;
//mp[a[s]]为0说明a[s]这个知识点已不在区间内
if(mp[a[s]] == 0)
cnt--;
s++;
}
printf("%d\n",res);
return 0;
}