单调栈(Monotonic Stack)

算法总结——单调栈 单调栈不是一种新的数据结构,它在结构上仍然是一个普通栈,只是在使用方法上有所区别。单调栈内的元素是单调递增或递减的,因此有单调递增栈和单调递减栈。单调递增栈: 栈中元素从栈底到栈顶是递增的。单调递减栈: 栈中元素从栈底到栈顶是递减的。我们在使用单调栈的时候,要时刻保证栈的单调性,例如,单调递增栈:栈中元素从栈底到栈顶是递增的。当一个元素入栈时,与栈顶比较,若比栈顶大,则入栈;若比栈项小,则弹出栈顶,直到这个数能入栈为止。注意:每个元素都一定入栈。 阅读详情

单调栈是一种和单调队列类似的数据结构。单调队列主要在 O ( n ) O(n) O(n)复杂度下解决滑动窗口问题,单调栈主要在 O ( n ) O(n) O(n)复杂度下解决Next Greater Element(NGE)问题(对序列中的每个元素找下一个/上一个比他大/小的元素)

基本思想

单调栈维护一个栈,表示“待确定NGE的元素”,然后遍历序列。当碰上一个新元素,越靠近栈顶的元素离新元素的位置越近。所以不断比较新元素与栈顶,如果新元素比栈顶大,则可断定新元素就是栈顶的NGE,于是弹出栈顶并继续比较。直到新元素不比栈顶大,再将新元素压入栈。显然,这样形成的栈是单调递减的。

案例

举个例子,寻找数列中第 i i i个元素之后第一个大于它的元素值(没有则返回-1):

数组栈结果说明
10 3 7 4 12初始化
10 3 7 4 1210(索引:0)-当 i = 0 i=0 i=0时,栈空,则10入栈
10 3 7 4 1210 3(索引:0 1)- -当 i = 1 i=1 i=1时,10大于3,则3入栈
10 3 7 4 1210 7(索引:0 2)- 7 -当 i = 2 i=2 i=2时,3小于7,则3出栈,结果数组中索引1位置标记为7,7入栈
10 3 7 4 1210 7 4(索引:0 2 3)- 7 - -当 i = 3 i=3 i=3时,7大于4,则4入栈
10 3 7 4 1212(索引:4)12 7 12 12 -当 i = 4 i=4 i=4时,12大于4,12大于7,12大于10,结果数组中索引0、2、3位置标记为12,12入栈
10 3 7 4 1212 7 12 12 -1由于在 i = 4 i=4 i=4之后没有大于12的元素,所以返回-1

其的核心代码为:

public class Template {
    public void template(int[] nums) {
        int n = nums.length;
        int[] ans = new int[n];
        Stack<Integer> s = new Stack<>();

        for (int i = 0; i < n; i++) {
            if (!s.isEmpty()) {
                while (!s.isEmpty() && nums[s.peek()] < nums[i]) {
                    ans[s.pop()] = nums[i];
                }
            }
            s.push(i);
        }
        while (!s.isEmpty()) ans[s.pop()] = -1;
        for (int a : ans) System.out.printf("%d ", a);
    }

    public static void main(String[] args) {
        Template template = new Template();
        template.template(new int[]{10, 3, 7, 4, 12});
    }
}

题目链接

  1. 2289. 使数组按非递减顺序排列

参考文献:

  1. 单调栈
  2. 【模板】单调栈,上面的题目和该题目返回的结果不一致,该题返回的时索引,上题返回的是数值
单调栈详解 定义: 单调栈,顾名思义就是栈内元素单调按照递增(递减)顺序排列的栈。 适用问题: 要知道单调栈的适用于解决什么样的问题,我们首先需要知道单调栈的作用。单调栈分为单调递增栈和单调递减栈,通过使用单调栈我们可以访问到下一个比他大(小)的元素(或者说可以)。也就是说在队列或数组中,我们需要通过比较前后元素的大小关系来解决问题时我们通常使用单调栈。下面我们通过简单介绍单调减栈和单调增栈问题来进一步... 阅读详情

相关推荐

数据结构与算法:单调栈(monotonic stack)

文章目录背景小窍门LeftBigger例子代码LeftSmaller例子代码RightBigger例子代码RightSmaller例子代码测试LeetCode题目 背景 我们经常会遇到这种类型的问题: 给定一个数组,针对数组中每个元素,找出其左边第一个比它大的数(LeftBigger); 给定一个数组,针对数组中每个元素,找出其左边第一个比它小的数(LeftSmaller); 给定一个数组,针对数组中每个元素,找出其右边第一个比它大的数(RightBigger); 给定一个数组,针对数组中每个元素,找出其

sun%moon 889

单调栈(C/C++)

单调栈(C/C++)

m0_73096566的博客 9800

GD32F103RCT6/GD32F303RCT6(6.2)USART串口实战:从寄存器配置到DMA高效传输

本文详细介绍了GD32F103RCT6和GD32F303RCT6的USART串口通信实战,从寄存器配置到DMA高效传输的全过程。通过具体的代码示例和优化建议,帮助开发者快速掌握串口通信的关键技术,提升嵌入式开发效率。特别强调了DMA在高速数据传输中的优势和应用技巧。

weixin_33725239的博客 308

算法数据结构——关于单调栈(Monotone Stack)的详细讲解及应用案例

单调栈(Monotone Stack):一种特殊的栈。在栈的「先进后出」规则基础上,要求「从栈顶到栈底的元素是单调递增(或者单调递减)」。其中满足从栈顶到栈底的元素是单调递增的栈,叫做「单调递增栈」。满足从栈顶到栈底的元素是单调递减的栈,叫做「单调递减栈」。注意:这里定义的顺序是从「栈顶」到「栈底」。有的文章里是反过来的。本文全文以「栈顶」到「栈底」的顺序为基准来描述单调栈。

白话机器学习 3万+

安卓ai自动化脚本 Yyds.Auto实现 示例 纯ai图像识别自动点击脚本

纯ai识别实现自动化脚本

专注安卓前沿科技 4780

InfiniBand(IB)实战指南:从硬件配置到性能优化

本文是一份详尽的InfiniBand实战指南,涵盖从硬件选型、部署到驱动配置、性能优化的全流程。重点解析了InfiniBand作为AI训练与高性能计算(HPC)核心网络的优势,特别是其支持的RDMA技术如何实现微秒级低延迟。文章提供了硬件匹配、NCCL压测、内核参数调优及在PyTorch分布式训练中启用IB的实操步骤,旨在帮助工程师构建和优化高性能计算集群。

mqtt6iot的博客 578

单调栈Monotonic Stack

Input 5 1 4 2 3 5 Output 2 5 4 5 0 链接:https://www.luogu.com.cn/problem/P5788 单调栈:使得每次新元素入栈后,栈内的元素都保持有序的单调递增或单调递减 可以把数组的元素比喻成人的身高,将这些人站成一列,从一个人开始,求他后面可见的第一个人 例如样例中,元素[4],比喻一个身高为4的人,那么这个人的后面可见的第一个人就是[5],因为[2],[3]身高都比[4]矮,被挡住了。 代码如下: #include<iostream.

weixin_45771864的博客 395

AD9371实战:如何用ZCU106搭建JESD204B TX时钟链(含关键参数计算)

本文详细解析了如何基于Xilinx ZCU106开发板为AD9371搭建JESD204B TX时钟链。文章从系统需求出发,逐步推导出从IQ采样率到GTH线速率的关键参数计算公式,并提供了在Vivado中配置GTH收发器(包括QPLL选择、分频比设置)的实战步骤与调试技巧,旨在帮助硬件工程师快速实现稳定可靠的JESD204B高速数据传输链路。

weixin_29164843的博客 292

单调栈(monotonic stack)揭秘

本文尝试揭秘单调栈的关键点。

FinixLei的专栏 (https://github.com/FinixLei) 3891

PaddleOCR实战:如何在CentOS 8.5上搭建高性能OCR识别环境

本文详细介绍了在CentOS 8.5系统上搭建高性能PaddleOCR识别环境的完整指南。从系统环境准备、PaddlePaddle框架部署到PaddleOCR的定制化安装与性能优化,提供了针对生产环境的解决方案,包括GPU/CPU环境配置、内核参数调优及常见问题排查,帮助用户实现高效OCR识别。

weixin_29223603的博客 349

S7-1200 G2移植旧版本S7-1200程序的具体方法示例

S7-1200 G2移植旧版本S7-1200程序的具体方法示例

Robot_PLC_HMI_Automation 1509

单调队列 Monotonic Queue / 单调栈 Monotonic Stack

2018-11-16 22:45:48 一、单调队列 Monotone Queue 239.Sliding Window Maximum 问题描述: 问题求解: 本题是一个经典的可以使用双端队列或者说单调队列完成的题目,具体来说,就是通过双端队列将可能的最大值维护起来。 public int[] maxSlidingWindow(int[] nums...

aitie1479的博客 370

【干货分享】高通 SA8295P PCB 设计规范指南

高通SA8295P芯片是第四代骁龙汽车数字座舱平台的核心组件,采用5nm工艺,集成高性能CPU/GPU和30TOPS算力的NPU。文章详细介绍了该芯片各接口的layout设计规范,包括USB3.1/2.0、eDP/DP、MIPI CSI/DSI、PCIe Gen3等接口的阻抗、损耗、延时等关键指标要求,为新能源汽车电子设计提供重要参考。

一只豌豆象的博客 260

单调栈(monotonic stack)的C++实现与应用

简介 单调栈(monotonic stack)是一种由栈(stack)衍生出来的数据结构,其操作方式与一般的栈基本一致,只是在元素入栈的时候,需要保证其与原先栈顶元素的大小关系1;若不满足,则不断将栈顶元素弹出,直至关系满足或栈为空为止。以上操作使得栈内的元素具有“单调性”。 但是,由于栈类数据结构通常只能在栈顶位置读写,我们也并不会直接利用容器内元素,而是在新元素入栈时,利用自然产生的信息,即哪些元素被按照规则弹出。也可以在一轮入栈操作后,“观察”栈内剩下的元素,得出一定的结论。 第一个实现 由于C++语

hyj53的博客 1191

模型压缩技术:剪枝、量化与知识蒸馏实战

模型压缩技术:剪枝、量化与知识蒸馏实战,在深度学习领域,模型的性能往往与模型的规模紧密相关,更大的模型通常能学习到更复杂的模式,从而在任务中取得更好的效果。然而,随着模型规模的不断增大,其在实际应用中面临着诸多挑战,如内存占用高、计算资源需求大、推理速度慢等问题,这使得在资源受限的设备(如移动设备、嵌入式设备)上部署变得困难重重。模型压缩技术应运而生,它旨在在尽可能保持模型性能的前提下,通过各种方法减少模型的参数数量和计算量,提高模型的效率和可部署性。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 5万+

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Monotonic Stack(单调栈)

问题类型栈的单调性遍历方向关键操作下一个更大元素递减(栈底大→栈顶小)反向(或正向出栈时)遇到大于栈顶时弹出下一个更小元素递增(栈底小→栈顶大)反向(或正向出栈时)遇到小于栈顶时弹出最大矩形递增正向,末尾加 0弹出时计算面积,宽度由左右边界确定单调栈的两类模板反向模板:适合直接求“之后第一个大于/小于”的问题,结果在遍历时直接填入数组。正向模板:在元素出栈时处理结果,常用于需要同时知道左右边界的题(如柱状图最大矩形)。

weixin_74400487的博客 152

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

AcWing 830. 单调栈(Monotonic stack Module) Described by Java

Today we again learn the monotonic stack module , it is very difficult to think. The problem : 给定一个长度为N的整数数列,输出每个数左边第一个比它小的数,如果不存在则输出-1。 输入格式 第一行包含整数N,表示数列长度。 第二行包含N个整数,表示整数数列。 输出格式 共一行,包含N个整数,其中第i个数表...

SoKeeGan 221

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

每天学一个算法--单调栈(Monotonic Stack)

这篇教案深入浅出地讲解了单调栈的核心原理和应用。文章从"找右边第一个更大元素"的实际问题切入,通过分步演示栈的操作过程(如[2,1,2,4,3]的处理),生动展示了单调栈如何以O(n)时间复杂度解决问题。重点解析了单调递减栈和递增栈的区别、标准代码模板、常见应用场景(如柱状图最大矩形、股票问题等),并指出常见错误(弹栈时机、存储内容、处理方向)。最后强调单调栈本质是通过有序结构高效解决顺序比较问题,是处理"下一个更大/更小元素"类问题的利器。

JustinMars的博客 480

LeetCode 496. Next Greater Element I - 单调栈(Monotonic Stack)系列题1

所谓单调栈(Monotonic Stack)就是,栈里的元素是按单调递增或递减顺序排列的,它特别适用于解决查找一个序列中的一个元素的下一个更大的或更小的元素的问题。 这是一道经典的单调栈的题,因为用暴力解法的话时间复杂度为O(n^2),而单调栈则为O(n)。

hgq522的博客 562

LeetCode 456. 132 Pattern - 单调栈(Monotonic Stack)系列题6

题目给定一个整型数组,问是否存在三个数的子序列满足132模式,所谓132模式就是三个数保持数组中的顺序,第三个数大于第一个数但小于第二个数。这题是一道变形的单调栈类型题,要是不放在单调栈系列里刷是很难想到可以用单调栈的。

hgq522的博客 570

LeetCode 654. Maximum Binary Tree - 单调栈(Monotonic Stack)系列题10

这道题的解法很直观,就是界定好左右边界,然后找到该范围内的最大值把数组分成左右两部分,以该最大值为根节点,然后递归处理左右两部分子数组,分别为根节点的左右子树。看似跟单调栈没什么关系,但是利用单调栈优化算法可以提高速度。

hgq522的博客 893

LeetCode 739. Daily Temperatures - 单调栈(Monotonic Stack)系列题3

这道题其实就是求下一个更大数(Next Greater Number),只是被包装成气温相关的问法。

hgq522的博客 419

LeetCode 42. Trapping Rain Water - 单调栈(Monotonic Stack)系列题4

题目给定一个非负整数的数组,数组里每个数表示一个宽度为1的柱子的高度,由于柱子之间的高度差就会形成一个个槽位,这样一下雨这些槽位就会装满水。问最多能装多少单位的水? 先来分析一下什么情况才能装水,两根紧挨着的柱子肯定无法形成槽位,因此至少是三根以上的柱子;要是柱子高度单调递增或递减也无法形成槽位。只有出现一排柱子边上的两根柱子高于中间的柱子才能形成槽位。根据以上分析,跟单调栈的算法很相似,因此可以用单调栈来解答该题。

hgq522的博客 559
上一篇: 单调队列(Monotonic Queue)
下一篇: 二叉堆(Binary Heap)
小菜2小白
博客等级 码龄4年 4粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值