当前位置: 首页 > news >正文

单调栈通用思路

引言

单调栈往往比较抽象,无论是栈头到栈底,还是从左到右,往往是记不住、易混淆递增递减关系,尤其是有时候数右边第一个大的数,有时候数左边第一个大的数。

其实从更抽象的角度来看,可以把栈看作已经遍历好的数,i是当前遍历的数,跳出栈内的递增或递减关系。

什么是单调栈?一句话说清核心

单调栈本质是用来维护一组**【有单调关系的已遍历元素】**。它的核心作用是:在遍历过程中,通过栈顶元素和当前元素的对比,快速找到「之前元素」和「当前元素」的大小关系,从而高效解决「下一个更大 / 更小元素」这类问题。

以找下一个更大元素为例

拿例子 nums = [73, 74, 75, 71, 71, 72, 76, 73] 来说,我们要找每个元素右边第一个比它大的元素。

如果需要找比当前元素大的元素,从栈的角度来看,栈中存放了当前遍历的i之前的信息。

  • 如果i 比栈顶元素大,说明之前的元素(现已在栈内)找到了该元素(i,下一个比它大的元素),而且i还可能比栈内其他元素也大;
  • 如果i 比栈内元素小,则说明i不是要找的元素。

关键是理解从栈存放的是已遍历过的元素,i是当前遍历的元素,可以弱化对栈头到栈顶是递增还是递减的判断,可以先假设栈内元素一定维护某个关系且一定是遍历之前的元素,所以就可以得到当前元素i和栈顶的关系,以及对应的操作。

题目清单

下面是力扣中有关单调栈的几个经典题目,数字表示力扣编号,链接是简单记录。

力扣-单调栈-739 每日温度

力扣-单调栈-503 下一个更大的元素Ⅱ

力扣-单调栈-42 接雨水

力扣-单调栈-84 柱状图中最大的矩形

http://www.dtcms.com/a/324132.html

相关文章:

  • CrackMapExec--安装、使用
  • Matlab算法代码速成5:Matlab求解分段微分方程编程示例
  • Linux环境下实现简单TCP通信(c)
  • Vue 3 快速入门 第五章
  • Jetpack系列教程(二):Hilt——让依赖注入像吃蛋糕一样简单
  • ROGUE: 【张院士团队R包】一种基于熵的用于评估单细胞群体纯度的度量标准
  • 第十五讲:set和map
  • Celery分布式任务队列
  • vscode uv 发布一个python包:编辑、调试与相对路径导包
  • Rust进阶-part6-宏
  • WPFC#超市管理系统(5)商品布局、顾客登录、商品下单
  • redis集群-docker环境
  • JAVA+AI简化开发操作
  • `sk_buff` 结构体详解(包含全生命周期解析)
  • How Websites Work 网站如何运作
  • 社交与职场中的墨菲定律
  • 2025年6月电子学会全国青少年软件编程等级考试(Python三级)真题及答案
  • DBAPI 实现不同角色控制查看表的不同列
  • 量子计算机实用化:从理论到现实的艰难跨越
  • 数据中心可视化:算力中枢智能运维
  • 编程基础之字符串——统计数字字符个数
  • JDBC的连接过程(超详细)
  • 【Docker-Day 12】揭秘容器网络:深入理解 Docker Bridge 模式与端口映射
  • Python爬虫-爬取政务网站的文档正文内容和附件数据
  • 【Linux | 网络】数据链路层
  • 电脑清理3步速成法
  • 三相LLC拓扑分析
  • CompletableFuture实现Excel sheet页导出
  • 产品经理入门 - 产品解决方案(需求分析、 功能优先级划分、功能价值、用户体验)
  • RabbitMQ面试精讲 Day 19:网络调优与连接池管理