3个小时没做出来,救
#include<iostream>
#include<cstdio> //scanf(), printf()
#include<cstring> //memset()
const int N = 1000100;
int a[N], b[N];
int main()
{
int n, num = 0, cnt = 0, ans = N;
scanf("%d", &n);
for(int i = 0; i < n; ++i) {
scanf("%d", &a[i]);
if(b[a[i]] == 0) {
num++;
b[a[i]] = 1;
} //得到不重复元素个数num
}
memset(b, 0, sizeof(b)); //初始化数组b
for(int i = 0, j = 0; i < n; ++i) {
if(b[a[i]] == 0) //a[i]原来不在区间内
cnt += 1; //区间内不重复元素个数
b[a[i]]++; //区间内a[i]个数
while(cnt == num) { //区间包括所有内容,这里不用if
if(ans > i - j + 1) ans = i - j + 1;
b[a[j]]--;
if(b[a[j]] == 0) cnt--;
j++; //左边界右移, j++记得放最后!!!
}
}
printf("%d", ans);
return 0;
}