浅谈单调队列、单调栈

       初谈这个话题,相信许多人会有一种似有所悟,但又不敢确定的感觉。没错,这正是因为其中“单调”一词的存在,所谓单调是什么,学过函数的people都知道单调函数或者函数的单调性,直白一点说单调就是一直增或一直减。例如:1,3,5,9就是一个单调增数列,数列中不存在后一个数比前一个数小的现象。那么同样,在这里谈到的话题也有类似特点。

       先说一下单调队列吧!      单调队列,就是一个符合单调性质的队列,它同时具有单调的性质以及队列的性质。他在编程中使用频率不高,但却占有至关重要的地位。它的作用很简单,就是为了维护一组单调数据,让我们在运行的过程中能够快速寻求前k个或后k个中最大或最小的值。    至于单调栈,相信看完上面的叙述后,都会有一个大概的理解,单调栈就是一个符合单调性质的栈它同时具有单调的性质以及栈的性质。在作用方面两者是相同的,差别仅是在编程过程中所维护的数组的方式不同。

       下面我会举个简单的列子来解释单调队列及单调栈。

       例题:有一组数据1,5,9,4,7,8,6,他们会依此输入,同时,在某一时刻会让你求出后n个数中的最大值。                 

       根据题意,我们可以得出这样一个结论,若后一个数大于前一个数,则结果必定不会是前一个数(比如现在输入了1,5,由于1<5,所以无论是后几个数中的最大值均不会为1),因此,我们只需维护一个单调递减的数组便可快速求得所需之。(数组变化如下:输入——1,数组——1;输入——5,由于5>1删去1添入5,数组——5;输入——9,由于9>5删去5添入9,数组——9;输入——4,由于4<9直接添入,数组——9,4;输入——7,由于7>4同时7<9因此删去4添入7,数组——9,7;输入——8,由于8>4同时8<9因此删去7添入8,数组——9,8;输入——6,由于6<8直接添入,数组——9,8,6。)

      单调队列及单调栈的基础也就这些,剩下的就只剩下个人理解及练习了。推荐几道题,在大视野上的1012以及1047,其中1012比较裸适合初学者做,1047略有难度推荐做完1012后再做。(在这里给个提示,1047要用到两次单调队列、单调栈,横着一次再用结果竖这一次。)

       最后谢谢观看我的博客,希望对你有所帮助。

时间: 2024-10-08 02:39:01

浅谈单调队列、单调栈的相关文章

单调队列单调栈

单调队列单调栈 Tags:数据结构 更好阅读体验:https://www.zybuluo.com/xzyxzy/note/1041449 一.概述 单调队列单调栈是很基础的数据结构,常用来优化一些东西比如说优化DP 那么大概意思就是在栈或队列中按照某关键字单调维护信息,从而实现一些功能 其实很久之前接触过单调队列和单调栈,但一直没有刷题,趁这两天被LCT弄晕的时候复习下这些 先看题 二.题单 普及- [x] P1886 滑动窗口 https://www.luogu.org/problemnew/

浅谈Java中的栈和堆

人们常说堆栈堆栈,堆和栈是内存中两处不一样的地方,什么样的数据存在栈,又是什么样的数据存在堆中? 这里浅谈Java中的栈和堆 首先,将结论写在前面,后面再用例子加以验证. Java的栈中存储以下类型数据,栈对应的英文单词是Stack 基本类型 引用类型变量 方法 Java的堆中存储以下类型数据,堆对应的英文单词是Heap 实例对象 在函数中定义的一些基本类型的变量(8种)和对象的引用变量都是在函数的栈Stack内存中分配.当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间,当

【NOIP数据结构专项】单调队列单调栈

[洛谷P1901 ]发射站 http://www.luogu.org/problem/show?pid=1901 题目描述 某地有 N 个能量发射站排成一行,每个发射站 i 都有不相同的高度 Hi,并能向两边(当 然两端的只能向一边)同时发射能量值为 Vi 的能量,并且发出的能量只被两边最近的且比 它高的发射站接收. 显然,每个发射站发来的能量有可能被 0 或 1 或 2 个其他发射站所接受,特别是为了安 全,每个发射站接收到的能量总和是我们很关心的问题.由于数据很多,现只需要你帮忙计 算出接收

小Z爱序列(NOIP信(sang)心(bin)赛)From Fall_Dream(粗制单调队列&amp;单调栈的算法解析)

原题: 小Z最擅长解决序列问题啦,什么最长公共上升然后下降然后上升的子序列,小Z都是轻松解决的呢. 但是小Z不擅长出序列问题啊,所以它给了你一道签到题. 给定一个n个数的序列ai,你要求出满足下述条件的点对的数量. 假设点对是(i , j),max(l,r)是[l,r]当中最大的ai的值. 这个点对满足条件当且仅当i+1<j 且 ai < max(i+1,j-1) < aj 为了简单,保证输入的是一个1-n的排列.相信你已经会做了吧? 输入/输出格式 输入数据第一行有一个数字n,然后第二

单调队列&amp;单调栈归纳

单调队列 求长度为M的区间内的最大(小)值 单调队列的基本操作,也就是经典的滑动窗口问题. 求长度为M的区间内最大值和最小值的最大差值 两个单调队列,求出长度为M的区间最大最小值的数组,分别求最大最小值. 求边长为a的正方形内最大值和最小值的最大差值([HAOI2007]理想的正方形) 一个大体的思路是先分别求出以i,j为左上端点的边长为a的矩形中的最大值和最小值.那么该怎么做?,先用单调队列求出一个点右边a个单位的最大值,形成一个新矩阵,再求出新矩阵下边a个单位的最大值.然后最小值再求一边,最

单调队列/单调栈入门详解+题目推荐

以前一直以为这两个是很高级的东西,这段时间用到了才开始学,发现实际上非常简单 下面我们以单调队列为例进行讲解,单调栈自行类比 顾名思义 单调队列这个名字就指明了它的性质--单调性 我们来看一道例题--滑动窗口 题面在此不再赘述,大意就是有一个长度为\(n\)的数列,一个长度为\(k\)的窗口,输出窗口位于每个位置下的下的最大最小值 嗯,题目很好理解,st表或者线段树过的先别说话,我们来看看另一种方法 我们维护一个长度为k的队列,使得队列的开头为答案,那么我们每次只需要输出开头就好了.这个想法很好

单调队列 单调栈

建议不了解STL的读者先了解几个基本的队列的STL.这也是单调队列和单调栈一般都会用到的. 单调队列:建立一个队列,使队列一直具有单调性(满足单调递增或者单调递减),时间复杂度O(N). 那么我们应该如何做到"使队列一直具有单调性"呢? 以单调递增为例,我们O(N)扫描整个序列,每扫描到一个元素: 1 如果该元素大于等于队列末尾元素,则直接入队; 2 而如果该元素小于已有队列的末尾元素,即不满足单调递增,则使队列中的末尾元素出队,直到该元素符合入队条件,然后入队. 如果只到这里,那么我

[hdu1506]单调队列(栈)

题意:http://acm.hdu.edu.cn/showproblem.php?pid=1506看图一目了然.两个方向单调队列维护下. 1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 #include <cstdlib> 5 #include <cstring> 6 #include <map> 7 #include <queue> 8

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

一道例题,给定一串数字,求每连续k个数字的最大.最小值. 思路:初始化一个初始长度为k的单调队列,按从左到右加入元素,同时满足这个队列中的元素是递减的(也就是假如某个数被两个距离不超过k的大于他的数夹着,他会被从队尾调出队列).得到最大值. 向右移动一格,假如队首离开范围,出队.往队尾加入元素前,把队尾的所有比它小的元素全部出队. 得到新的最大值. #include<bits/stdc++.h> using namespace std; struct Monotone_Queue{ deque

浅谈PHP数据结构之栈

今天開始进阶自己的PHP,首先一切的编程语言都须要修炼自己的"内功",何为程序猿的"内功",我想大概就是数据结构和算法了吧 .毕竟是灵魂,是普通程序猿到高级程序猿的进阶. 不多说.直接说主题--"栈". 什么是栈,所谓栈就是遵循"后进先出"的原则. 先进栈的最后出栈. 用PHP实现栈无需考虑栈溢出的情况,相对来说比較easy实现,例如以下是经过学习和參考后的代码. <?php class Stack{ private $