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

LeetCode刷题必备:用单调栈5分钟搞定‘直方图最大矩形’和‘子数组最值差’两道经典题

LeetCode刷题必备单调栈速解两道经典难题的实战套路面试官在白板上写下直方图最大矩形和子数组最值差两道题时前排候选人已经开始冒汗——这类问题在LeetCode中属于中等偏上难度常规解法要么时间复杂度太高要么边界条件处理复杂。但如果你掌握单调栈这个数据结构中的特种部队5分钟内写出最优解并非天方夜谭。本文将拆解两道经典例题提炼出可复用的解题模板让你在面试中遇到类似问题时能快速识别模式、套用框架。1. 单调栈的核心武器库单调栈Monotonic Stack本质上是在栈的FILO特性基础上额外维护栈内元素的单调性递增或递减。这种结构特别适合解决**下一个更大/更小元素**、边界扩展类问题。其核心优势在于能将O(n²)的暴力解法优化到O(n)时间复杂度。关键操作特征单调递增栈栈底到栈顶元素值严格递增用于寻找第一个更小元素单调递减栈栈底到栈顶元素值严格递减用于寻找第一个更大元素实战技巧遇到数组中的区间最值问题时先画图模拟单调栈处理过程比直接写代码更易理解2. 直方图最大矩形的降维打击LeetCode第84题要求找到直方图中面积最大的矩形。常规思路需要双重循环计算每个柱子作为高度的最大宽度时间复杂度O(n²)。而单调栈解法只需一次遍历def largestRectangleArea(heights): stack [-1] # 哨兵节点 heights.append(0) # 触发最终清算 max_area 0 for i in range(len(heights)): while heights[i] heights[stack[-1]]: # 破坏单调递增 h heights[stack.pop()] w i - stack[-1] - 1 max_area max(max_area, h * w) stack.append(i) return max_area代码模板解析初始化栈并加入哨兵节点避免空栈判断在数组末尾追加0值确保所有柱子被处理维护单调递增栈当遇到较小元素时触发面积计算宽度计算采用当前索引与栈顶前一位的差值常见踩坑点忘记处理最后剩余的柱子需追加0触发清算宽度计算错误应使用i - stack[-1] - 1而非简单相减未使用哨兵节点导致边界条件复杂化3. 子数组最值差的数学拆解LeetCode第907题要求所有子数组的最大值最小值之差的和。暴力解法需要枚举所有子数组复杂度O(n³)。通过单调栈可以拆解为两个独立问题计算所有子数组的最大值之和计算所有子数组的最小值之和最终结果 最大值之和 - 最小值之和def sumSubarrayRanges(nums): def calculate(func): stack [] res 0 for i in range(len(nums) 1): while stack and (i len(nums) or func(nums[i], nums[stack[-1]])): mid stack.pop() left stack[-1] if stack else -1 res nums[mid] * (mid - left) * (i - mid) stack.append(i) return res return calculate(lambda x, y: x y) - calculate(lambda x, y: x y)模式识别要点使用高阶函数复用单调栈逻辑仅比较逻辑不同贡献度计算(当前元素作为最值的左边界跨度) × (右边界跨度)数组末尾虚拟节点确保清算所有元素对比两种场景的单调栈应用差异特征直方图最大矩形子数组最值差栈类型单调递增栈最大值用递减栈最小值用递增栈触发计算时机遇到更小元素时遇到破坏单调性元素时结果贡献计算方式高度 × 扩展宽度值 × 子数组组合数边界处理追加零高度柱子追加虚拟终止节点4. 单调栈的通用解题框架通过上述案例可以提炼出单调栈的四步解题法问题转化识别是否属于边界扩展/最值类问题单调性选择需要找更小用递增栈需要找更大用递减栈清算逻辑设计确定何时弹出栈顶元素遇到破坏单调性的元素时设计弹出时的计算结果累积方式边界处理初始哨兵节点通常为-1终止触发机制追加特殊值或虚拟节点将这个框架应用到其他相似题目每日温度LeetCode 739找下一个更高温度的天数 → 单调递减栈滑动窗口最大值LeetCode 239维护窗口内的递减序列 → 双端队列实现接雨水LeetCode 42找左右边界的最小值 → 左右指针或单调栈5. 面试实战中的高频失误与应对在压力环境下即使知道算法原理也容易翻车。以下是面试官反馈的常见问题及解决方案内存溢出忘记弹出栈元素导致栈无限增长修复确保每次入栈前正确处理破坏单调性的元素# 错误示范 while stack and nums[i] nums[stack[-1]]: res nums[stack[-1]] # 忘记pop会导致死循环 # 正确写法 while stack and nums[i] nums[stack[-1]]: idx stack.pop() res nums[idx]边界条件错误空栈访问stack[-1]引发异常修复初始放入哨兵值如-1时间复杂度误判误以为嵌套循环就是O(n²)实际分析每个元素最多入栈出栈各一次 → O(n)最近在帮学员mock interview时发现80%的错误都集中在边界处理。建议在写完代码后立即用以下case验证空输入数组全相同元素数组严格递增/递减序列包含重复元素的随机序列6. 单调栈的进阶应用场景掌握基础模式后可以处理更复杂的变种问题二维矩阵中的最大矩形LeetCode 85将矩阵按行转化为多个直方图问题每行高度累积前一行的非零值def maximalRectangle(matrix): if not matrix: return 0 m, n len(matrix), len(matrix[0]) height [0] * n max_area 0 for row in matrix: for j in range(n): height[j] height[j] 1 if row[j] 1 else 0 max_area max(max_area, largestRectangleArea(height)) return max_area带限制条件的最值差如子数组长度不超过k的最大值最小值差结合单调队列滑动窗口最值与单调栈思想在最近参与的代码竞赛中遇到一道变形题需要计算所有子数组的中位数之和。通过将问题转化为对于每个元素统计其作为多少个子数组的第k大元素同样可以用单调栈配合容斥原理解决。

相关文章:

LeetCode刷题必备:用单调栈5分钟搞定‘直方图最大矩形’和‘子数组最值差’两道经典题

LeetCode刷题必备:单调栈速解两道经典难题的实战套路 面试官在白板上写下"直方图最大矩形"和"子数组最值差"两道题时,前排候选人已经开始冒汗——这类问题在LeetCode中属于中等偏上难度,常规解法要么时间复杂度太高&…...

华为S5735S交换机iStack堆叠实战:从零配置到业务上线

1. 为什么选择iStack堆叠技术 第一次接触华为S5735S交换机堆叠时,我也被各种堆叠技术名词绕晕了。iStack、CSS、堆叠卡、业务口堆叠...后来在实际项目中摸爬滚打才发现,电口堆叠才是中小型网络的最优解。就拿最近一个客户案例来说,他们原有单…...

从CPU到外设:实战解析AHB5总线在GD32/RISC-V SoC中的互连设计与性能调优

AHB5总线在RISC-V SoC中的高效互连设计与性能调优实战 在当今嵌入式系统设计中,总线架构的选择与优化直接影响着整个芯片的性能表现。作为AMBA总线家族中的重要成员,AHB5协议凭借其高效率、低延迟的特性,已成为众多RISC-V SoC设计的首选互连方…...

C# .NET 与 SAP RFC 接口交互:从参数映射到实战封装

1. SAP RFC接口与.NET集成的核心挑战 在企业级应用开发中,SAP系统往往承载着核心业务流程,而现代应用开发又大量采用.NET技术栈。要让这两个不同生态的系统高效对话,RFC(Remote Function Call)是最常用的桥梁技术。但实…...

告别MyBatis的‘?‘占位符:用p6spy 3.9.1在Spring Boot里打印可直接执行的SQL(附自定义日志格式)

告别MyBatis的?占位符:用p6spy 3.9.1在Spring Boot里打印可直接执行的SQL(附自定义日志格式) 调试SQL语句是Java开发中的日常操作,但MyBatis和JPA等ORM框架输出的预编译SQL总带着恼人的?占位符。每次排查问题时,开发…...

Simulink代码生成实战:如何让参数结构体在C代码里也‘整整齐齐’

Simulink参数结构体工程化实践:从模型到嵌入式代码的无缝衔接 在嵌入式系统开发中,Simulink模型到C代码的转换质量直接影响着最终产品的可靠性和维护成本。当面对包含数百个参数的复杂控制系统时,如何保证生成的代码既保持高可读性又能完美对…...

保姆级教程:在RuoYi-AI里用Ollama跑通本地Llama3模型(附完整配置截图)

零基础实战:RuoYi-AI与Ollama深度整合指南 第一次在本地环境跑通Llama3模型时,那种"不依赖任何云服务"的成就感至今难忘。作为一款开箱即用的AI开发框架,RuoYi-AI与Ollama的组合让本地大模型部署变得前所未有的简单——但魔鬼往往藏…...

避坑指南:在Win10上用VS2019编译ITK 5.2和RTK 2.3,我踩过的那些坑都帮你填平了

避坑指南:在Win10上用VS2019编译ITK 5.2和RTK 2.3,我踩过的那些坑都帮你填平了 医学图像处理开发者常需搭建ITKRTK环境,但官方文档往往只展示理想路径。本文将解剖我在Windows 10VS2019环境中部署ITK 5.2和RTK 2.3时遇到的7类典型故障&#x…...

别再手动算了!用JavaScript/Node.js实现RGB到HEX颜色转换的三种实用方法

别再手动算了!用JavaScript/Node.js实现RGB到HEX颜色转换的三种实用方法 在Web开发中,颜色值的处理无处不在。从动态主题切换、Canvas绘图到CSS-in-JS方案,RGB与HEX颜色格式的转换是开发者经常需要处理的基础操作。手动计算虽然可行&#xff…...

“SpringSource Training Schedule: September 2013”是指2013年9月SpringSource

“SpringSource Training Schedule: September 2013”是指2013年9月SpringSource(后被VMware收购,现相关培训已整合进Pivotal及后续的VMware Tanzu培训体系)发布的官方培训课程安排。该计划曾涵盖Spring Framework、Spring Integration、Spri…...

Spring Security 3.2.0.RC1(Release Candidate 1)是 Spring Security 框架在 2013 年底发布的候选版本

Spring Security 3.2.0.RC1(Release Candidate 1)是 Spring Security 框架在 2013 年底发布的候选版本,标志着 3.2.x 系列的初步稳定。该版本引入了多项重要改进与新特性,包括: Java Config 支持增强:进一步…...

“Community-Driven Spring Integration Extensions”(社区驱动的 Spring Integration 扩展)是指由 Spring 社区

“Community-Driven Spring Integration Extensions”(社区驱动的 Spring Integration 扩展)是指由 Spring 社区(而非 Spring 官方核心团队)开发、维护和贡献的一系列补充性模块,用于增强 Spring Integration 的功能边…...

“Spring Data release train reaches RC station” 是 Spring 官方常用的一种拟人化表达

“Spring Data release train reaches RC station” 是 Spring 官方常用的一种拟人化表达,意指 Spring Data 的某个版本发布周期(Release Train)已进入 Release Candidate(RC)阶段,即“候选发布版”。这表示…...

“Video: Managing and Monitoring Spring Integration Applications”很可能是指关于如何对基于 Spring Integration 的企业集

“Video: Managing and Monitoring Spring Integration Applications”很可能是指关于如何对基于 Spring Integration 的企业集成应用进行运行时管理与监控的教学视频(例如来自 Spring 官方、SpringOne 大会、Baeldung、YouTube 技术频道或 Pluralsight 等平台的内容…...

虚拟机安装Ubuntu 24.04.x及其常用软件(2026.4)

此次更新把安卓模拟器,烧录工具,无效软件,以及收费软件等不常用软件去除,另外更新了一些下载链接,删除了一些和配置无关的图片。 目录 1 系统安装篇 1.1 安装VMWare Workstation Pro 1.2 下载Ubuntu 24.04.x安装镜…...

Linux 了解硬件体系结构和操作系统内核的管理

目录 冯诺依曼体系结构 操作系统 系统调用接口 进程 启动进程的两种方式:手动启动和代码启动 冯诺依曼体系结构 冯诺依曼结果就是计算机硬件体系结构,硬件主要由五大单元组成: 我们主要讲这五大单元中的存储: 其中存储器就是…...

Open UI5 源代码解析之1104:MenuItem.js

源代码仓库: https://github.com/SAP/openui5 源代码位置:src\sap.ui.commons\src\sap\ui\commons\MenuItem.js MenuItem.js 文件深度分析 文件的直观定位 MenuItem.js 是一个体量非常小的文件,但它在 openui5 这样的大型项目里并不轻。原因在于,它不是靠大段业务逻辑…...

计算机常用英文词汇概念解释

目录 1、property与attribute 2、run、execute与perform 3、option、item、menu、context menu 4、configuration、setting 5、parameter与 argument 6、function、feature 7、command line 8、terminal与console 9、shell ... 计算机常用英文词汇概念解释 伴随着计算机的诞生和…...

电子元件知识汇总4-采购与真伪识别

目录: 一、电阻R 二、电容C 1、钽电容 三、电感L 四、二极管D 1、MB10M、MB10S与MB10F 2、ES2A THRU ES2M 3、KBJ3510、GBJ3510 五、三极管与场效益管Q 1、PBSS4160DPN三极管...

如何快速上手FlashDB:5分钟学会嵌入式数据存储

如何快速上手FlashDB:5分钟学会嵌入式数据存储 【免费下载链接】FlashDB An ultra-lightweight database that supports key-value and time series data | 一款支持 KV 数据和时序数据的超轻量级数据库 项目地址: https://gitcode.com/gh_mirrors/fl/FlashDB …...

SSD硬盘对HTML工具速度有影响吗_存储介质与开发效率关系【详解】

SSD显著提升HTML开发效率:启动快4.6秒、热重载快750ms、构建快24.7秒、DevTools加载快11.8秒,因SSD在随机读写、I/O延迟和吞吐量上远超HDD。如果您在使用HTML开发工具时发现页面加载、文件保存或构建过程响应迟缓,则可能是存储介质的读写性能…...

tabula-py错误处理大全:解决10个最常见的表格提取问题

tabula-py错误处理大全:解决10个最常见的表格提取问题 【免费下载链接】tabula-py Simple wrapper of tabula-java: extract table from PDF into pandas DataFrame 项目地址: https://gitcode.com/gh_mirrors/ta/tabula-py 在处理PDF表格数据时,…...

Android Studio中文插件终极指南:3步搞定界面汉化,开发效率翻倍!

Android Studio中文插件终极指南:3步搞定界面汉化,开发效率翻倍! 【免费下载链接】AndroidStudioChineseLanguagePack AndroidStudio中文插件(官方修改版本) 项目地址: https://gitcode.com/gh_mirrors/an/AndroidStudioChinese…...

为什么宝塔面板误删网站数据库无法通过回收站恢复_需依赖面板先前的定时备份或底层数据快照

不能恢复,除非是通过宝塔数据库页面点击【删除】按钮操作的;其他方式如命令行、phpMyAdmin、API调用或站点删除时勾选删库均不进入回收站,且需满足回收站启用、未超保留期、/www/.Recycle目录权限正常三个前提。不能恢复,除非你删…...

终极 HashiCorp Otto 项目常见问题解决方案:从安装到部署的完整指南

终极 HashiCorp Otto 项目常见问题解决方案:从安装到部署的完整指南 【免费下载链接】otto Development and deployment made easy. 项目地址: https://gitcode.com/gh_mirrors/otto/otto HashiCorp Otto 是一款致力于简化开发和部署流程的强大工具&#xff…...

/usr/bin/ssh-copy-id: ERROR: no identities found 解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…...

题解:洛谷 AT_abc389_d [ABC389D] Squares in Circle

本文分享的必刷题目是从蓝桥云课、洛谷、AcWing等知名刷题平台精心挑选而来,并结合各平台提供的算法标签和难度等级进行了系统分类。题目涵盖了从基础到进阶的多种算法和数据结构,旨在为不同阶段的编程学习者提供一条清晰、平稳的学习提升路径。 欢迎大家订阅我的专栏:算法…...

题解:洛谷 AT_abc389_c [ABC389C] Snake Queue

本文分享的必刷题目是从蓝桥云课、洛谷、AcWing等知名刷题平台精心挑选而来,并结合各平台提供的算法标签和难度等级进行了系统分类。题目涵盖了从基础到进阶的多种算法和数据结构,旨在为不同阶段的编程学习者提供一条清晰、平稳的学习提升路径。 欢迎大家订阅我的专栏:算法…...

Production Rails扩展架构设计:如何从单体应用到分布式系统的平滑演进

Production Rails扩展架构设计:如何从单体应用到分布式系统的平滑演进 【免费下载链接】production_rails Best practices for running Rails in production 项目地址: https://gitcode.com/gh_mirrors/pr/production_rails 在现代Web应用开发中,…...

Windows 11下ROS2 Humble与PyCharm环境搭建全攻略(附常见错误解决方案)

Windows 11下ROS2 Humble与PyCharm环境搭建全攻略(附常见错误解决方案) 在机器人操作系统(ROS)生态中,Windows平台的支持一直是个痛点。随着ROS2 Humble版本的发布,微软与开源社区的深度合作为Windows开发者…...