单调栈算法应用指南:快速寻找变量序列中下一个更大值

千敏吖_3843

千敏吖_3843

2026-05-19

144人浏览

原创

单调栈是用列表模拟并维护元素单调性的技巧,核心解决“每个元素右侧第一个更大值”问题,时间复杂度o(n);栈存索引,栈底到栈顶严格递减,入栈前弹出破坏单调性的元素,通过nums[i] > nums[stack[-1]]判断,需先判栈非空再取值。

单调栈算法应用指南:快速寻找变量序列中下一个更大值

单调栈不是内置结构,而是一种用列表模拟栈、并主动维护元素单调性的技巧。核心目标是高效解决“每个元素右侧第一个更大值”这类问题,时间复杂度稳定在 O(n),远优于暴力遍历的 O(n²)。

关键逻辑:栈中存索引,入栈前弹出破坏单调性的元素

栈底到栈顶保持严格递减(找“下一个更大”时),这样一旦遇到比栈顶大的数,就能立刻确认栈顶元素的答案就是当前数。必须存原始索引而非数值——否则无法回填结果数组对应位置。

  • 每次比较用 nums[i] > nums[stack[-1]],不是和索引值比
  • while 条件顺序不能颠倒:stack and nums[i] > nums[stack[-1]],先判非空再取值,避免 IndexError
  • 每个索引最多入栈、出栈各一次,保证线性时间

标准实现:一次遍历完成所有更新

以数组 [1,3,4,2] 为例:

Clickable
Clickable

一款利用 AI 快速生成数字广告素材的在线创作工具,可根据产品和营销需求制作视觉与文案方案,帮助企业提高广告创意生产速度。

下载
  • i=0,栈空,push(0) → 栈=[0]
  • i=1,nums[1]=3 > nums[0]=1,pop(0),result[0]=3;再 push(1) → 栈=[1]
  • i=2,nums[2]=4 > nums[1]=3,pop(1),result[1]=4;push(2) → 栈=[2]
  • i=3,nums[3]=2
  • 遍历结束,栈中剩余索引对应位置保持 -1(无更大值)

处理循环数组:用取模代替拼接

面对如 [1,2,1] 这类循环数组,最后一个 1 的答案是 2(绕回开头)。不必复制数组浪费空间,只需遍历 2n−1 次,真实索引用 i % n 计算。

  • 初始化 result = [-1] * n,利用 -1 作为未更新标记,防止重复赋值
  • 内层 while 中仍用原始数组下标比较:nums[idx] > nums[stack[-1]]
  • 栈中始终存原始索引(0 到 n−1),确保 result 更新位置准确

常见误区提醒

容易写错但影响巨大的细节:

  • 只 append 不 pop → 栈不断膨胀,失去单调性,退化为普通容器
  • 弹出条件写反,比如写成 nums[i] → 变成维护递增栈,逻辑完全错位
  • 用栈存数值而非索引 → 找不到该填到 result 哪个位置,无法构造输出
  • 忽略空栈判断,直接访问 stack[-1] → 运行时报错

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
treenode的用法
treenode的用法

​在计算机编程领域,TreeNode是一种常见的数据结构,通常用于构建树形结构。在不同的编程语言中,TreeNode可能有不同的实现方式和用法,通常用于表示树的节点信息。更多关于treenode相关问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.12.01

2441

7

C++ 高效算法与数据结构
C++ 高效算法与数据结构

本专题讲解 C++ 中常用算法与数据结构的实现与优化,涵盖排序算法(快速排序、归并排序)、查找算法、图算法、动态规划、贪心算法等,并结合实际案例分析如何选择最优算法来提高程序效率。通过深入理解数据结构(链表、树、堆、哈希表等),帮助开发者提升 在复杂应用中的算法设计与性能优化能力。

2025.12.22

356

20

深入理解算法:高效算法与数据结构专题
深入理解算法:高效算法与数据结构专题

本专题专注于算法与数据结构的核心概念,适合想深入理解并提升编程能力的开发者。专题内容包括常见数据结构的实现与应用,如数组、链表、栈、队列、哈希表、树、图等;以及高效的排序算法、搜索算法、动态规划等经典算法。通过详细的讲解与复杂度分析,帮助开发者不仅能熟练运用这些基础知识,还能在实际编程中优化性能,提高代码的执行效率。本专题适合准备面试的开发者,也适合希望提高算法思维的编程爱好者。

2026.01.06

377

22

C++ 数据结构与算法实现教程合集
C++ 数据结构与算法实现教程合集

以 C++ 为实现语言,系统讲解核心数据结构与算法,涵盖链表(单链表/双链表/环检测)、栈与队列(单调栈/优先队列)、二叉树(遍历/BST/AVL/红黑树)、哈希表(开地址法/链地址法)、图(邻接表/BFS/DFS/Dijkstra/拓扑排序)、常见排序算法(快排/归并/堆排/计数排序)的实现与复杂度分析,同时分享 LeetCode 刷题技巧、竞赛编程常用模板(二分/前缀和/滑动窗口/动态规划),帮助开发者夯实算法基础。

2026.05.09

432

25

页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

2023.08.14

5636

4

PixTV官网入口地址合集
PixTV官网入口地址合集

本专题汇总了 PixTV AI 一站式视频创作平台的官方入口与使用教程。无需下载软件,浏览器直接访问即可使用。平台将剧本、图像、视频、声音与剪辑整合在“无限画布”中,接入 GPT Image 2.5、Seedance 2.5 等头部模型。本专题整理了从新建画布、角色锚定、分镜拆分到视频生成与导出的完整操作指南,助你快速上手 AI 短剧与漫剧创作。

2026.10.10

80

15

Kratos框架HTTP与gRPC服务开发教程
Kratos框架HTTP与gRPC服务开发教程

本专题围绕Kratos框架双协议服务开发,涵盖HTTP路由与处理器编写、参数获取、gRPC服务实现与客户端调用、metadata上下文传递、encoding编解码注册、统一响应封装、超时控制与流式响应实现方法。

2026.10.10

40

15

Kratos框架Protobuf接口定义与代码生成合集
Kratos框架Protobuf接口定义与代码生成合集

本专题讲解Kratos框架接口定义体系,涵盖proto编写规范、proto add/client/server生成命令、http注解路由、validate校验、OpenAPI文档生成、跨服务proto复用与兼容性设计。

2026.10.10

20

15

C++虚函数怎么定义和调用
C++虚函数怎么定义和调用

C++虚函数是实现运行时多态的重要机制。本专题从virtual关键字的基本用法入手,介绍基类与派生类之间的函数重写、基类指针调用派生类方法,以及动态绑定的执行过程,帮助初学者掌握虚函数的核心语法。

2026.10.10

20

26

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
GDB Reference Card
GDB Reference Card

共0课时 | 0人学习

《Debugging with GDB》用户手册
《Debugging with GDB》用户手册

共0课时 | 0人学习

Valgrind FAQ
Valgrind FAQ

共0课时 | 0人学习