输入样例:53 4 2 7 5输出样例:-1 3 -1 2 2普通做法,时间复杂度O(n^2),可能会TLE#include <
原创
2022-06-15 10:52:57
151阅读
初谈这个话题,相信许多人会有一种似有所悟,但又不敢确定的感觉。没错,这正是因为其中“单调”一词的存在,所谓单调是什么,学过函数的people都知道单调函数或者函数的单调性,直白一点说单调就是一直增或一直减。例如:1,3,5,9就是一个单调增数列,数列中不存在后一个数比前一个数小的现象。那么同样,在这里谈到的话题也有类似特点。
转载
2023-07-20 07:26:05
111阅读
(文章目录) 前言 本文介绍单调栈和单调队列的使用,并且提供模板。 一、单调栈? 栈地到栈顶是单调增加或者单调减少的。 1.代码模板: //常见模型:找出每个数左边离它最近的比它大/小的数 //stk[0]是不存放元素的,stk[tt]存放栈顶元素 int tt = 0; for (int i = ...
转载
2021-07-25 00:33:00
670阅读
2评论
单调栈可以方便(O(n))地求出一个数,左右第一个比它大/小的数的位置如何求----给一个序列 2,3,6,9,4,7,1我们先求左边第一个比它小的栈为空,a[S.top()]<a[1] 所以 l[1]=0,S.push(1)单调栈里存的是编号接下来a[S.top()]<a[2] 所以l[2]=S.top=1, S.push(1)同理但是到4的时候a[S.top()]>
原创
2022-07-05 10:01:52
62阅读
之前我们讲了 队列、栈 优先队列,本文看下单调队列和单调栈。
单调队列
也许这种数据结构的你没听过,但他其实就是一个队列,只不过是用了巧妙的方法使得队列中的元素单调递增或单调递减。(当然,优先队列也可以求最值,只不过 JavaScript 语言没有原生支持,实现起来较麻烦)
单调队列解决什么问题?
给出数字数组 arr,比如他有 5 个元素,这时可能有 2 个操作:
插入新元素
删除已有元素
原创
2023-05-19 14:20:37
105阅读
单调栈板子题https://www.luogu.com.cn/problem/P5788#include <iostream>#include <stack>using
原创
2021-07-21 12:49:41
38阅读
前言:本篇用了我比较长的时间,干货较多,甚至一篇顶三篇,希望各位耐心观看。Part 1:单调栈 单调栈是一种数据结构,一般分为单调递增栈和单调递减栈。单调栈一般用来解决寻找下一个大于或小于m的值。 我们把得到的答案放到K数组里。 一个经典例题:定义函数 在单调栈中,如果栈为空,那么K[i]就为0,如果栈不为空,则判断栈顶是否大于a[i],如果不是,那么弹出栈顶。最后,不管什么情
最近几天接触了单调队列,还接触了单调栈,就总结一下。
其实单调队列,和单调栈都是差不多的数据类型,顾名思义就是在栈和队列上加上单调,单调递增或者单调递减。当要入栈或者入队的时候,要和栈头或者队尾进行比较,满足单调的性质则入队入栈,否则将当前元素删去,直到满足单调性质。
那么问题来了,单调队列,和单调栈有什么用了。最普遍的最重要的作用就是起到优化的作用。当然我目前也只知道这个所用。
原创
2022-10-18 14:03:10
78阅读
注:部分模板来自acwing yxc 栈表示的是一种瓶子一样的数据容器,对应STL中的stack,我们只能从瓶子最上面拿东西,但是我们放东西只能从最下面开始放,所以最后放入东西要最先拿出来。虽然说在STL中有相应的容器,但是手动模拟的运行速度会更快一些。 const int N = 1e5 + 10 ...
转载
2021-09-28 10:02:00
242阅读
2评论
概要:对于维护信息具有单调性的性质或者问题可以转化为具有单调性质的模型的题,我们可以考虑用单调栈或单调队列。技巧及注意:技巧很多,只要能将问题转化为单调性问题,就好解决了。当维护固定长度的单调区间,我们考虑用单调队列
原创
2021-08-11 14:42:31
148阅读
#include<cstdio> #include<string> #include<cstdlib> #include<cmath> #include<iostream> #include<cstring> #include<set> #include<queue> #include<algori
转载
2018-08-11 16:34:00
132阅读
2评论
栈 算法思路 栈(\(stack\))又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元 ...
转载
2021-06-19 15:24:00
252阅读
2评论
单调栈 or 单调队列,是指序列中的元素严格递增 or 递减。可以解决一
转载
2013-02-18 01:34:00
84阅读
2评论
测试地址:栈 做法:本题需要用到单调栈+单调队列。 我们可以用一些高级数据结构O(nlog⁡n)" role="presentation" style="position: relative;">O(nlogn)O(nlogn)简易地算出这个...
转载
2018-04-17 17:56:00
189阅读
2评论
序 说起这个话题,应该很多人会有一种似有所悟,但又不敢确定的感觉。 (我差不多就是那样) 没错,这正是因为其中“单调”一词的存在。 那么单调是什么? 学过函数的人都知道单调函数或者函数的单调性吧 其实直白一点说单调,就是一直增或一直减。 eg:1,3,5,9就是一个单调增数列,数列中不存在后一个数比
原创
2021-08-03 09:38:36
146阅读
2018-11-16 22:45:48 一、单调队列 Monotone Queue 239. Sliding Window Maximum 问题描述: 问题求解: 本题是一个经典的可以使用双端队列或者说单调队列完成的题目,具体来说,就是通过双端队列将可能的最大值维护起来。 public int[]
转载
2018-11-16 22:57:00
677阅读
2评论
#include<iostream>using namespace std;const int N=10010;int n;int stk[N],tt;int main(){ cin>>n; for(int i=0;i<n;i++){ int x;
题意: 一条线段上有n张骨牌(n=1e7), 相邻骨牌距离为1,每张骨牌有其高度和推倒的花费,问最少的花费推倒所有的骨牌。 题解: 首先用单调栈维护每个位置往左(右)推能推倒的最远的骨牌 dp[i]表示1-i倒下的最小花费 转移显然只有两种 一种是第i张往左推动 另一种是找到往右推动能推倒i的最小花
转载
2020-01-26 15:29:00
81阅读
2评论
单调栈是一种特殊的栈,要求栈中的元素是单调递减或者单调递减的。1、适用场景单调栈适合的题目是求解下一个大于 xxx或者下一个小于 xxx这种题目。所有当你有这种需求的时候,就应该想到单调栈。2、介绍比如我们需要依次将数组 [1,3,4,5,2,9,6] 压入单调栈。首先压入 1,此时的栈为:[1]继续压入 3,此时的栈为:[1,3]继续压入 4,此时的栈为:[1,3,4]继续压入 5,此时的栈为:
目录单调栈(Monotone Stack)42. 接雨水84. 柱状图中最大的矩形方法1:暴力法O(n^2)方法2:单调栈O(n)单调栈:不使用Stack,使用Deque方法3:暴力优化(本题最优解)单调栈(Monotone Stack)栈的应用中有一类问题称为单调栈(Monotone Stack)问题,可以巧妙的将某些问题的时间复杂度降到「O(n)级别」。那么什么是单调栈呢?所谓单调栈,就是保持