1. 程式人生 > >滑窗模板_雙向隊列

滑窗模板_雙向隊列

lib pre n) 感謝 問題 {} 模板 while 長度

附上電科算法講堂 https://www.bilibili.com/video/av23189029?t=641 (感謝那些講課的美好的人們)

/*
*  註:  還有少許細節問題可能需要註意: 例如 總長度小於窗口長度的情況.
*       和rGetMax  rGetMin 下標小於零的情況 沒有pass.. 
*/

class HuaChuang_Max {
public:
    struct cnobe {
        int id;
        int val;
        cnobe () {}
        cnobe (int _id, int _val) : id(_id), val(_val) {}
    };
    
    deque
<cnobe> cq; int GetMax(int date[], int ans[], int sz, int len) { // [a, b] a>=1 開始滑窗 int cnt = 0; int i; while (!cq.empty()) cq.pop_back(); for (i=1; i<len; ++i) { while (!cq.empty() && cq.back().val < date[i]) cq.pop_back(); cq.push_back(cnobe(i, date[i])); }
for (i=len; i<=sz; ++i) { while (!cq.empty() && cq.back().val < date[i]) cq.pop_back(); cq.push_back(cnobe(i, date[i])); while (i - cq.front().id >= len) cq.pop_front(); ans[cnt++] = cq.front().val; }
return cnt; } int GetMin(int date[], int ans[], int sz, int len) { // [a, b] a>=1 開始滑窗 int cnt = 0; int i; while (!cq.empty()) cq.pop_back(); for (i=1; i<len; ++i) { while (!cq.empty() && cq.back().val > date[i]) cq.pop_back(); cq.push_back(cnobe(i, date[i])); } for (i=len; i<=sz; ++i) { while (!cq.empty() && cq.back().val > date[i]) cq.pop_back(); cq.push_back(cnobe(i, date[i])); while (i - cq.front().id >= len) cq.pop_front(); ans[cnt++] = cq.front().val; } return cnt; } int rGetMax(int date[], int ans[], int sz, int len) { // [a, b] a>=1 開始滑窗 int cnt = 0; int i; while (!cq.empty()) cq.pop_back(); for (i=sz; i>sz-len+2 && i>0; --i) { while (!cq.empty() && cq.back().val < date[i]) cq.pop_back(); cq.push_back(cnobe(i, date[i])); } for (i=sz-len+2; i>0; --i) { while (!cq.empty() && cq.back().val < date[i]) cq.pop_back(); cq.push_back(cnobe(i, date[i])); while (cq.front().id - i >= len) cq.pop_front(); ans[i] = cq.front().val; cnt++; } return cnt; } int rGetMin(int date[], int ans[], int sz, int len) { // [a, b] a>=1 開始滑窗 int cnt = 0; int i; while (!cq.empty()) cq.pop_back(); for (i=sz; i>sz-len+2 && i>0; --i) { while (!cq.empty() && cq.back().val > date[i]) cq.pop_back(); cq.push_back(cnobe(i, date[i])); } for (i=sz-len+2; i>0; --i) { while (!cq.empty() && cq.back().val > date[i]) cq.pop_back(); cq.push_back(cnobe(i, date[i])); while (cq.front().id - i >= len) cq.pop_front(); ans[i] = cq.front().val; cnt++; } return cnt; } }hc;

滑窗模板_雙向隊列