模板 - 数据结构 - 单调队列/单调栈

一道例题,给定一串数字,求每连续k个数字的最大、最小值。

思路:初始化一个初始长度为k的单调队列,按从左到右加入元素,同时满足这个队列中的元素是递减的(也就是假如某个数被两个距离不超过k的大于他的数夹着,他会被从队尾调出队列)。得到最大值。

向右移动一格,假如队首离开范围,出队。往队尾加入元素前,把队尾的所有比它小的元素全部出队。

得到新的最大值。

#include<bits/stdc++.h>
using namespace std;

struct Monotone_Queue{
    deque<int> q;

    void push(int value){
        while(!q.empty()&&q.back()<value){
            q.pop_back();
        }
        q.push_back(value);
    }

    int front(){
        return q.front();
    }

    void pop(){
        q.pop_front();
    }
};

struct Monotone_Stack{
    stack<int> s;

    void push(int value){
        while(!s.empty()&&s.top()<value){
            s.pop();
        }
        s.push(value);
    }

    int top(){
        return s.top();
    }

    void pop(){
        s.pop();
    }
};

 

posted @ 2019-03-08 23:33  韵意  阅读(108)  评论(0编辑  收藏  举报