码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2019-03-09 01:09:38      阅读:163      评论:0      收藏:0      [点我收藏+]

标签:出队   space   span   return   void   std   结构   单调队列   struct   

一道例题,给定一串数字,求每连续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();
    }
};

 

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

标签:出队   space   span   return   void   std   结构   单调队列   struct   

原文地址:https://www.cnblogs.com/Yinku/p/10472977.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!