链接
经典的贪心题目
注意1.页数在int范围内,数组会越界,所以用map来记录是否读过该书籍
2.每次操作最后更新l和r
#include<iostream>
#include<cstdio>
#include<set>
#include<algorithm>
#include<map>
using namespace std;
const int N=1e6+10,INF=0x3f3f3f3f;
int a[N],n,cnt,ans=INF;
map<int,int> vis;
set<int> s;
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
s.insert(a[i]);
}
int l=1,r=1;
while(r<=n){
if(!vis[a[r]]){
cnt++;
}
vis[a[r]]++;
r++;
while(cnt==s.size()){
vis[a[l]]--;
if(!vis[a[l]]) cnt--;
l++; //最后更新l,之前更新会判断的vis不是当前的这一个
ans=min(ans,r-l+1);
}
}
printf("%d\n",ans);
}