news 2026/5/1 7:11:23

单调栈算法讲解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
单调栈算法讲解

单调栈(Monotonic Stack)本质上就是**“带约束的栈”
在任何时刻,栈内元素都保持
单调递增或单调递减**的顺序。一旦新元素破坏这个单调性,就不断出栈,直到恢复单调为止。


一、为什么要有单调栈?

很多问题的核心是这类需求:

  • 对每个元素,快速找到它左边/右边第一个比它大或小的元素

  • 比如:

    • 下一个更大元素(Next Greater Element)
    • 柱状图最大矩形
    • 接雨水
    • 股票价格跨度

如果暴力做:
每个元素向左/右扫描,时间复杂度是O(n²)

单调栈的价值在于:
把这类问题统一降到 O(n)


二、单调栈的核心不变量(Invariant)

单调栈始终维护一个顺序不被破坏的栈结构

  • 单调递增栈:栈底 → 栈顶,值越来越大
  • 单调递减栈:栈底 → 栈顶,值越来越小

关键不是“递增/递减”本身,而是:

栈里留下的,都是“还没找到答案”的元素

一旦某个新元素能“解决”栈顶元素的问题,
栈顶就该出栈了。


三、为什么是 O(n)?

这是单调栈最容易被误解、但最重要的一点。

每个元素:

  • 最多入栈一次
  • 最多出栈一次

所以:

  • 总入栈 ≤ n
  • 总出栈 ≤ n
  • 总操作 ≤ 2n →O(n)

哪怕有while循环,也不会爆。


四、栈里到底存什么?

这点非常关键,很多人会混淆。

两种常见存法

1. 存「值」
  • 适合只关心大小关系
  • 比如 Next Greater Element(只要值)
2. 存「下标」(更常见)
  • 需要算距离、区间、面积时必须用下标

  • 比如:

    • 柱状图最大矩形
    • 接雨水
    • 最近更大/更小元素的距离

实战中90% 都是存下标


五、四种经典变体(一定要会的表)

目标栈类型扫描方向
右侧第一个更大单调递减左 → 右
右侧第一个更小单调递增左 → 右
左侧第一个更大单调递减右 → 左
左侧第一个更小单调递增右 → 左

一句口诀:

找「更大」用递减栈,找「更小」用递增栈


六、单调栈的本质理解(很重要)

你可以把单调栈理解为:

一种“延迟决策”的结构

  • 元素入栈:
    “我还不知道我的答案是谁”
  • 元素出栈:
    “答案找到了,不需要我了”

栈中始终保存的是:

  • 未来可能被某个元素解决的问题集合

八、什么时候你该想到单调栈?

看到这些关键词,条件反射就对了:

  • 「第一个 / 最近的」
  • 「左边 / 右边」
  • 「比它大 / 比它小」
  • 「区间 / 连续 / 最大 / 最小」

好,这里给你一组单调栈必刷经典题清单,我会按「题目 → 思路 → 单调栈过程 → 答案实现」完整走一遍。
入门 → 核心 → 进阶,基本覆盖 90% 面试/竞赛场景。

九、经典题目

1、下一个更大元素(单调栈入门)

题目

给定数组nums,返回一个数组res
res[i]nums[i]右边第一个比它大的元素,没有则为-1

输入: [2,1,2,4,3] 输出: [4,2,4,-1,-1]

思路
  • 从左到右扫描
  • 单调递减栈
  • 栈中保存「还没找到更大元素的下标

单调栈过程
nums = [2,1,2,4,3] i=0: stack=[0] i=1: stack=[0,1] i=2: nums[2]=2 > nums[1]=1 → pop 1 → res[1]=2 stack=[0,2] i=3: 4 > 2 → pop 2 → res[2]=4 4 > 2 → pop 0 → res[0]=4 stack=[3] i=4: stack=[3,4]

答案(Python)
defnext_greater(nums):n=len(nums)res=[
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 5:58:49

中国汽车工程学会:飞行汽车发展报告:迈向空地一体交通新时代 2026

一、飞行汽车定义与战略定位飞行汽车是面向空地一体交通的电动垂直起降飞行器,包含纯飞式、分体式和两栖式三种形态,作为新型交通物种,其核心价值在于推动航空运输从 “小众专业” 向 “大众日常” 演进,同时将地面交通 “电动化、…

作者头像 李华
网站建设 2026/5/1 5:58:46

Qwen3-Embedding-4B最佳实践:指令定制化嵌入部署教程

Qwen3-Embedding-4B最佳实践:指令定制化嵌入部署教程 1. Qwen3-Embedding-4B介绍 你有没有遇到过这样的问题:想从成千上万的文档中快速找到最相关的几篇,但关键词搜索总是不够准?或者要做多语言内容推荐,却发现传统方…

作者头像 李华
网站建设 2026/5/1 5:58:52

5分钟快速上手:Android实时流媒体开发终极指南

5分钟快速上手:Android实时流媒体开发终极指南 【免费下载链接】libstreaming A solution for streaming H.264, H.263, AMR, AAC using RTP on Android 项目地址: https://gitcode.com/gh_mirrors/li/libstreaming 在移动互联网时代,实时视频流媒…

作者头像 李华
网站建设 2026/5/1 5:57:14

NeverSink过滤器终极指南:流放之路2高效拾取系统完全解析

NeverSink过滤器终极指南:流放之路2高效拾取系统完全解析 【免费下载链接】NeverSink-Filter-for-PoE2 This is a lootfilter for the game "Path of Exile 2". It adds colors, sounds, map icons, beams to highlight remarkable gear and inform the u…

作者头像 李华
网站建设 2026/5/1 0:41:09

EasyExcel终极指南:ExcelProperty注解value属性的完整解析与应用实践

EasyExcel终极指南:ExcelProperty注解value属性的完整解析与应用实践 【免费下载链接】easyexcel 快速、简洁、解决大文件内存溢出的java处理Excel工具 项目地址: https://gitcode.com/gh_mirrors/ea/easyexcel 在数据处理领域,Excel作为最常用的…

作者头像 李华
网站建设 2026/5/1 5:57:41

Relight:零基础掌握专业光影重塑,AI重新照明终极指南

Relight:零基础掌握专业光影重塑,AI重新照明终极指南 【免费下载链接】Relight 项目地址: https://ai.gitcode.com/hf_mirrors/dx8152/Relight 还在为照片光线不足、氛围感差而烦恼吗?Relight开源项目通过先进的AI技术,让…

作者头像 李华