1. 程式人生 > >滑動視窗最值(單調佇列)

滑動視窗最值(單調佇列)

問題:給定一個數組和滑動視窗的大小,找出所有滑動窗口裡數值的最大值。
解法:利用單調佇列來儲存未過期(在w視窗內)的之前的最大值,如果當前值大於該值,就從隊首彈出,直到找到大於當前值得位置,將當前值的位置壓入隊首,如果資料過期,就從隊尾刪除。(單調佇列)

int a[maxn];
int n;
int w;
deque<int> q;
void solve() {
    for (int i = 0; i<n; i++) {
        while (!q.empty()&&a[i] >= a[q.front()]) q.pop_front();
        q.push_front(i);
        if
(a[i] < a[q.front()]) q.push_front(i); if (i - q.back() == w) q.pop_back(); if (i >= w - 1) cout << a[q.back()] << endl; } }