poj 3320 Jessica's Reading Problem(双指针)
题目链接:http://poj.org/problem?id=3320
题意
在 n 个元素的数组中寻找包含所有大小元素的最短连续区间。
思路
双指针,在保证指针区间包括所有大小的同时每次删减最左端的一个大小。
代码
#include <cstdio> #include <set> #include <map> using namespace std; const int M = 1e6 + 100; int a[M]; int main() { int n; scanf("%d", &n); set<int> st; for (int i = 0; i < n; i++) scanf("%d", &a[i]), st.insert(a[i]); map<int, int> mp; int res = n + 1; for (int l = 0, r = 0, num = 0, tot_num = st.size();;) { while (r < n and num < tot_num) if (mp[a[r++]]++ == 0) ++num; if (num < tot_num) break; res = min(res, r - l); if (--mp[a[l++]] == 0) --num; } printf("%d\n", res); }