单调栈 —— 1.基本概念与核心算法

news2025/5/17 18:04:27

在这里插入图片描述

1. 基本概念

1.1 知识预备

在理解单调栈之前,我们需要先掌握两个基础概念:栈(Stack)单调性(Monotonicity)

什么是栈(Stack)

栈是一种**后进先出(LIFO, Last-In-First-Out)**的数据结构:

  • 新元素始终压入栈顶(push
  • 移除元素也始终从栈顶弹出(pop

我们可以把栈想象成一叠书:

  • 你只能从最上面放/取书(栈顶)
  • 先放进去的书在下面,必须等上面的书移除后才能访问

基本操作:

  • push(x):将元素 x 压入栈顶
  • pop():弹出栈顶元素
  • top():查看栈顶元素但不弹出
  • empty():判断栈是否为空

1.2 什么是单调栈

单调栈是栈的一种特殊使用方式,其特点是:始终保持栈内元素有序(单调递增或递减)

常见的两种形式:

  • 单调递增栈:栈中元素从栈底到栈顶递增(栈顶最小)
  • 单调递减栈:栈中元素从栈底到栈顶递减(栈顶最大)

例如,维护一个单调递增栈的过程:

初始空栈:[]
压入 3: [3]
压入 5: [3, 5] ✅(递增)
压入 2: ❌(2 小于栈顶 5,弹出 5,再比较 3,直到栈递增)最后的结果是 [2]

单调栈的本质:在压入元素时,通过弹出不满足单调性的栈顶元素,从而维护一个有序结构,方便我们高效地找到“下一个更大/小”的元素。

单调栈常解决的问题类型

适合使用 单调栈 的题目,通常具有以下几个显著特点:

1. 需要找“第一个满足条件的前/后缀元素”

比如:

  • 右边第一个比自己大的元素
  • 左边第一个比自己小的元素
  • 最近的更高温度、更高价格、更大柱子

👉 本质:找某个方向上第一个满足单调性条件的元素

2. 数组或序列题,且有“元素之间的相对关系”
  • 题目一般给定一个 一维数组/序列
  • 要你找出元素之间的顺序比较关系

例如:

  • 每个元素右边第一个更大的数
  • 每个元素左边第一个更小的位置
3. 暴力解法是 O(n²),但可以优化为 O(n)

如果你写出暴力法是两层循环查“后面第一个符合条件的元素”,就可以考虑:

是否能用单调栈来代替嵌套循环

单调栈能做到:

  • 每个元素最多被压入一次,弹出一次
  • 时间复杂度稳定在 O(n)
4. 问题与“范围”、“跨度”或“影响范围”有关

如:

  • 当前元素往左/右能扩展到多远
  • 柱状图中每个柱子形成的最大矩形
  • 股票价格连续上升/下降天数

这些问题都和某个元素能“影响”多远有关,适合用单调栈维护边界。


1.3 单调栈的常见例题

应用方向示例题目说明
找最近更大/小元素LeetCode 496(下一个更大元素)线性替代暴力嵌套循环
求区间最值相关LeetCode 84(柱状图最大矩形)栈维护高度索引
序列分析LeetCode 739(每日温度)找出等待更高温度的天数
股票分析LeetCode 901(股票价格跨度)求比当前价格小的最近时间间隔

2. 核心算法

2.1 解题思路(以“下一个更小元素”为例)

  • 使用一个栈,从左到右遍历数组
  • 当当前元素比栈顶元素小:说明找到“右侧第一个更小元素”
  • 栈中维护一个单调递增序列的索引

2.2 代码实现(Python 示例)

def next_smaller_elements(nums):
    res = [-1] * len(nums)
    stack = []
    for i in range(len(nums)):
        while stack and nums[i] < nums[stack[-1]]:
            idx = stack.pop()
            res[idx] = nums[i]
        stack.append(i)
    return res

2.3 灵活应用

变体需求应对策略
查找前一个更小/更大元素从右往左扫描
需要记录距离而不是值栈中存索引,使用 i - stack[-1]
找所有区间贡献与前一个/后一个满足条件元素组合出区间

3. 总结

对于一个新手而言,单调栈往往是让人感到 amazing 的方法,需要结合题目的特点进行分析,当满足前面提到的某一些特点的时候,可以考虑使用单调栈来解决问题。

单调栈只是一个工具,它甚至不能说是某一种算法。因此有时候考察的可能是单调栈与其他算法的结合,比如 DP 之类的。

这里对本文做个小结:

  • 单调栈是一个高效解决序列型“最值查找”问题的利器
  • 本质是维护一个具有顺序性质的栈
  • 实现时注意:栈中通常存储索引而非值
  • 单调栈常作为经典面试题考点,应熟练掌握其基本模板并灵活变形

更多的例子将会结合力扣、洛谷的题目进一步展开,感兴趣的小伙伴们不妨关注一波 ~

感谢各位小伙伴们的 阅读点赞评论关注 ~ 希望本文能帮助到各位,共勉 ~

在这里插入图片描述

Smileyan
2025.04.12 22:17

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2333693.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

工程师 - 场效应管分类

What Are the Different Types of FETs? Pulse Octopart Staff Jul 31, 2021 Field effect transistors (FETs) are today’s workhorses for digital logic, but they enjoy plenty of applications outside of digital integrated circuits, everything from motor driver…

Debezium报错处理系列之第128篇:增量快照报错java.lang.OutOfMemoryError: Java heap space

Debezium报错处理系列之第128篇:增量快照报错java.lang.OutOfMemoryError: Java heap space 一、完整报错二、错误原因三、解决方法Debezium从入门到精通系列之:研究Debezium技术遇到的各种错误解决方法汇总: Debezium从入门到精通系列之:百篇系列文章汇总之研究Debezium技…

AI——使用pandas

文章目录 1、pandas介绍2、为什么使用pandas3、pandas的数据结构1、Series2、DataFrame3、MultiIndex 4、pandas基本数据操作1、索引操作2、赋值操作3、排序4、算术运算5、逻辑运算6、逻辑运算函数7、统计函数8、累计统计函数9、自定义运算 5、pandas读取文件和存储1、csv文件2…

2025认证杯挑战赛B题【 谣言在社交网络上的传播 】原创论文讲解(含完整python代码)

大家好呀&#xff0c;从发布赛题一直到现在&#xff0c;总算完成了认证杯数学中国数学建模网络挑战赛第一阶段B题目谣言在社交网络上的传播完整的成品论文。 本论文可以保证原创&#xff0c;保证高质量。绝不是随便引用一大堆模型和代码复制粘贴进来完全没有应用糊弄人的垃圾半…

用docker容器创建属于自己的一方小世界!容器中,盖周天之变,化吾为王~

用docker容器创建属于自己的一方小世界&#xff01;容器中&#xff0c;盖周天之变&#xff0c;化吾为王~ 分别查看用户id和组id。 命令&#xff1a; 1、id -u 2、id -g 创建并运行容器 docker run -d -p 31404:22 -v /home/liub:/home -v /data:/app/data --user 1004:1004 --…

vue拓扑图组件

vue拓扑图组件 介绍技术栈功能特性快速开始安装依赖开发调试构建部署 使用示例演示截图组件源码 介绍 一个基于 Vue3 的拓扑图组件&#xff0c;具有以下特点&#xff1a; 1.基于 vue-flow 实现&#xff0c;提供流畅的拓扑图展示体验 2.支持传入 JSON 对象自动生成拓扑结构 3.自…

Linux服务器网卡深度解析:从ifconfig输出到生产环境性能调优实战

Linux服务器网卡深度解析&#xff1a;从ifconfig输出到生产环境性能调优实战 Linux服务器网卡深度解析&#xff1a;从ifconfig输出到生产环境性能调优实战一、背景二、生产环境的服务器部署情况三、拆解一个真实的 ifconfig 输出1、先看 MAC 地址2、再看设备的 interrupt 和 me…

《嵌套调用与链式访问:C语言中的函数调用技巧》

&#x1f680;个人主页&#xff1a;BabyZZの秘密日记 &#x1f4d6;收入专栏&#xff1a;C语言 &#x1f30d;文章目入 一、嵌套调用&#xff08;一&#xff09;定义&#xff08;二&#xff09;实现方式&#xff08;三&#xff09;优点&#xff08;四&#xff09;缺点 二、链式…

Python-控制语句

控制语句 控制语句和逻辑思维 控制语句:把语句组合成能完成一定功能的小逻辑模块分类:顺序、选择、循环“顺序结构”:代表“先执行a,再执行b”的逻辑“条件判断结构”:代表“如果…,则…”的逻辑“循环结构”:代表“如果…则重复执行…”的逻辑条件判断结构 选择结构通…

教程:在Typora中显示拼音——附处理工具

原因 因为自己普通话不标准&#xff0c;希望可以制作适合自己的带拼音的文档&#xff0c;可以把平常看到的内容、说过的话作为练习普通话的材料。 在市面上&#xff0c;带拼音的材料、书籍并不多&#xff0c;而且有可能是一些比较生僻的内容。所以希望可以自己制作这样的材料…

OpenCV 图形API(30)图像滤波-----腐蚀操作函数erode()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 使用特定的结构元素腐蚀图像。 cv::gapi::erode 是 OpenCV 的 G-API 模块中用于执行图像腐蚀操作的函数。腐蚀是一种基本的形态学操作&#xff…

特殊定制版,太给力了!

今天给大家分享一款超棒的免费录屏软件&#xff0c;真的是录屏的好帮手&#xff01; 这款软件功能可以录制 MP4、AVI、WMV 格式的标清、高清、原画视频&#xff0c;满足你各种需求。 云豹录屏大师 多功能录屏神器 它的界面特别简洁&#xff0c;上手超快&#xff0c;用起来很顺…

go:实现最简单区块链

1.新建文件夹命名为blockchain,在此文件夹下分别创建两个文件一个为block.go另一个为chain.go如下图所示: 2.写入代码: block.go package blockchainimport ("bytes""crypto/sha256""encoding/gob""log""strconv""ti…

工业相机使用笔记

目前工业相机有多种分类方式&#xff0c;以下是基于不同原理和特点的类别总结&#xff1a; 按维度分类 2D相机&#xff1a; 原理&#xff1a;通过镜头将二维平面上的物体成像在图像传感器上&#xff0c;传感器上的像素点阵列捕捉物体的光信号&#xff0c;并转换为电信号或数字…

系分论文《论面向服务开发方法在设备租赁行业的应用》

系统分析师论文系列 【摘要】 2022年5月&#xff0c;我司承接某工程机械租赁企业"智能租赁运营管理平台"建设项目&#xff0c;我作为系统分析师主导系统架构设计。该项目需整合8大类2000余台设备资产&#xff0c;覆盖全国15个区域运营中心与300家代理商&#xff0c;实…

04--网络属性设置与多路复用

一、TCP可靠性分析 二、 scoket 属性设置 1、socket 属性设置表 NAMEgetsockopt, setsockopt - get and set options on sockets获取 和 设置 套接字属性 SYNOPSIS#include <sys/types.h> /* See NOTES */#include <sys/socket.h>int getsockopt(int so…

AI领域再突破,永洪科技荣获“2025人工智能+创新案例”奖

在2025年的今天&#xff0c;人工智能已从技术概念全面渗透至产业核心。中国作为全球AI技术应用的前沿阵地&#xff0c;正通过“人工智能”行动加速推进技术与实体经济深度融合。 这一背景下&#xff0c;永洪科技凭借其“国内某头部ICT人力资源板块GenAI项目”荣获“2025全国企业…

基于疾风大模型的新能源储能优化系统:方法、实现与案例分析

一、引言 随着可再生能源渗透率不断提高,储能系统在电力系统中的重要性日益凸显。传统储能控制方法主要基于规则策略和简单优化算法,难以应对高比例新能源场景下的复杂决策需求。本文将详细介绍如何利用疾风大模型(Gale Model)构建智能化的新能源储能优化系统,包含核心方…

菊风RTC 2.0 开发者文档正式发布,解锁音视频新体验!

重磅发布&#xff01; 开发者们&#xff0c;菊风实时音视频2.0文档已正式发布上线&#xff0c;为您提供更清晰、更高效的开发支持&#xff01;让菊风实时音视频2.0为您的音视频应用加速~ 菊风实时音视频2.0聚焦性能升级、体验升级、录制服务升级&#xff0c;助力视频通话、语…

OpenCv高阶(一)——图像金字塔(上采样、下采样)

目录 图像金字塔 一、上下采样原理 1、向下取样 2、向上采样 3、图像金字塔的作用 二、案例实现 1、高斯下采样 2、高斯金字塔中的上采样 3、对下采样的结果做上采样&#xff0c;图像变模糊&#xff0c;无法复原 4、拉普拉斯金字塔&#xff08;图片复原&#xff09; 图…