题意:给定一组数,其中有一些重复数字,求一个长度最小的区间,要求这个区间内包含这组数的全部数字。
如1 8 8 8 1输出2
思路:尺取法求解,用map判断是否出现
#include <cstdio> #include <iostream> #include <map> using namespace std; const int maxn = 1e6 + 10; int n, s, a[maxn]; map<int, int> m; int main() { while (scanf("%d", &n) == 1) { m.clear(); for (int i = 0; i < n; i++) { scanf("%d", &a[i]); if (!m[a[i]]) { m[a[i]] = 1; s++; } } m.clear(); int L = 0, R = 0, sum = 0, ans = maxn; for (R = 0; R < n; R++) { if (!m[a[R]]) { sum++; } m[a[R]]++; if (sum == s) { while (sum == s) { ans = min(ans, R - L + 1); m[a[L]]--; if (!m[a[L]]) { sum--; } L++; } } } printf("%d\n", ans); } return 0; }