反复推进区间的开头和末尾,来求取满足条件的最小区间的方法叫做尺取法。
这道题就可以用尺取法很好的求解。
#include <cstdio>
#include <set>
#include <map>
#include <algorithm>
using namespace std;
const int maxp = 1000000;
int a[maxp];
int main(int argc, char const *argv[]) {
int p;
set<int> all;
scanf("%d", &p);
for (int i = 0; i < p; i++) {
scanf("%d", &a[i]);
all.insert(a[i]);
}
int n = all.size();
int s = 0, t = 0, num = 0;
map<int, int> count;
int res = p;
for ( ; ; ) {
while (t < p && num < n) {
if (++count[a[t++]] == 1) {
num++;
}
}
if (num < n)
break;
res = min(res, t - s);
if (--count[a[s++]] == 0) {
num--;
}
}
printf("%d\n", res);
return 0;
}