思路:尺取法。
AC代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <set>
#include <map>
using namespace std;
int n, page, ans, p[1000000];
int i, cnt, s, e;
set<int> all;
map<int, int> t;
int main(){
scanf("%d", &page);
for(i = 0; i < page; i++){
scanf("%d", &p[i]);
all.insert(p[i]);
}
n = all.size();
cnt = 0, s = 0, e = 0, ans = page;
while(1){
while(cnt < n && e < page){
if(t[p[e]] == 0) cnt++;
t[p[e]]++;
e++;
}
if(cnt < n) break;
ans = min(ans, e - s);
if(t[p[s]] == 1) cnt--;
t[p[s]]--;
s++;
}
printf("%d\n", ans);
return 0;
}