zoukankan      html  css  js  c++  java
  • 浅谈单调队列

    浅谈单调队列

    本篇随笔简单讲解一下算法竞赛中的一种数据结构—单调队列。

    浅谈单调栈是姐妹篇,同样需要前置知识...你得知道队列是啥,然后单调这个词啥意思。


    一、单调队列的概念

    单调队列。

    就是前置知识加和。

    单调+队列。

    也就是说,对于这个单调队列来讲,队列中的元素是满足单调性的。

    那么当然有单调递增队列和单调递减队列等等的分类。

    这就是单调队列了。

    需要注意的一点是,这与普通的队列小有不同,普通队列要从尾入,从头出。但单调队列由于要维护单调性,需要从尾入,从头从尾都能出。也就是,如果要用C++STL的话,要用deque。


    二、单调队列的应用

    单调队列的概念非常简单,那么它的精髓就在于应用,也就是在队列上加了个单调性,它能够支持解决的问题有什么变化。

    单调队列所维护的问题是动态区间最大、最小值。也就是我们熟悉的“滑动窗口”。

    当然,因为不带修,可以考虑用树状数组、线段树、ST表等各种log算法水。但是数据范围稍大一些,不用(O(N))算法想过这道题,就是痴心妄想。

    动态区间最大最小值维护的精髓就是:直接取队首元素,就是答案。那么为了维护这个队首元素最大/最小,我们要采取如下的维护策略:首先,对于新加入元素,如果不符合单调性质,就从队尾弹到符合为止,如果符合性质直接入队。但是由于像滑动窗口等题目还会有其他限制,比如不能让超出范围的最小值继续成为最小值。那么这个时候要在队列中同时维护这个限制,然后从队首出队。

    这就是单调队列了。


    三、单调队列优化DP

    这是单独的一个部分。我们会开单独的博客进行讲解:

    浅谈单调队列优化DP

  • 相关阅读:
    saltstack实战
    ubuntu16配置mysql5.7主从同步
    推荐书单
    SpringMVC : 乐鲜电子商城
    Idea 使用指南
    SpringBoot : 人人托福系统网站
    Android : SQLite 版学生系统
    Android : 相机及本地储存
    Android : ListView 学生管理
    Android : SeekBar 实现图片旋转缩放
  • 原文地址:https://www.cnblogs.com/fusiwei/p/13926752.html
Copyright © 2011-2022 走看看