新闻详情

新闻详情

首页 / 资讯中心 / 详情

单调栈与单调队列终极对决:滑动窗口最大值(LeetCode 239)与接雨水(LeetCode 42)底层双模型穿透

发布时间:2026/9/27 8:04:51来源:尧图网络
单调栈与单调队列终极对决:滑动窗口最大值(LeetCode 239)与接雨水(LeetCode 42)底层双模型穿透
单调栈与单调队列终极对决滑动窗口最大值LeetCode 239与接雨水LeetCode 42底层双模型穿透在算法题库与大厂面试高频 Hard 题中“单调栈Monotonic Stack”与“单调队列Monotonic Queue”是一对名字极度相似、但在解决的问题维度、内部元素的进出机制、以及空间淘汰法则上截然不同的高级线性数据结构。经典标志性题型LeetCode 239滑动窗口最大值Sliding Window Maximum单调队列标志性题LeetCode 42接雨水Trapping Rain Water单调栈 vs 双指针双解法LeetCode 862和至少为 K 的最短子数组前缀和 单调双端队列LeetCode 84柱状图中最大的矩形单调栈标志性题。很多同学在面对具体题目时经常分不清到底什么时候用单调栈什么时候用单调队列为什么单调队列必须使用双端队列Deque双端队列的两端淘汰分别对应着什么物理含义单调栈的**“行切法按层横向累加”与双指针的“列切法按列纵向累加”**在接雨水中是如何形成数学对偶的今天我们把单调栈与单调队列的核心区别、底层淘汰状态机、以及两大经典 Hard 题的工业级代码彻底讲透。单调栈 vs 单调队列核心特性全景对比graph TD subgraph 单调栈 (Monotonic Stack: 解决【局部最近】极值) S1[操作端点: 仅在栈顶一端执行 Push / Pop] S2[核心应用: 寻找左侧/右侧【第一个更大/更小】的元素 (Next Greater Element)] S3[淘汰机制: 被入栈的新元素在数值上强行弹出 (压扁)] end subgraph 单调队列 (Monotonic Queue: 解决【滑动区间】极值) Q1[操作端点: 队尾插入/淘汰数值较小者, 队头淘汰超出窗口范围者 (双端 Deque)] Q2[核心应用: 动态滑动窗口 [i-k1, i] 内的【全局最大/最小值】] Q3[淘汰机制: 1. 队尾按数值淘汰 (维护单调性); 2. 队头按生命周期/过期时间淘汰!] end对比维度单调栈Monotonic Stack单调队列Monotonic Queue底层核心容器单端栈ArrayDeque/int[] stack双端队列Deque两头都可弹出元素淘汰动因纯粹由**“新元素的数值大小”**触发弹出双重淘汰队尾由数值大小淘汰队头由“窗口滑动过期”淘汰解决的问题模型寻找某个元素单侧第一个比它大/小的边界维护一个动态移动区间内的最值RMQ时间复杂度$\mathcal{O}(N)$每个元素最多进出栈 1 次$\mathcal{O}(N)$每个元素最多进出队 1 次一、单调队列实战滑动窗口最大值LeetCode 239问题给定数组nums和窗口大小k窗口每次向右滑动 1 步求每个窗口内的最大值。单调队列核心哲学“如果一个新加入的选手比你年轻位置靠后且比你更强数值更大那么你将永远没有出头之日可以直接光荣退役了”graph LR subgraph 单调递减双端队列 (队头恒为当前窗口最大值) Head[队头: 存储当前最大值索引] --- Mid[中间元素] --- Tail[队尾: 新元素入队] end NewElem[新元素 nums i 准备入队] --|1. 队尾淘汰: 若队尾元素 nums i, 循环从队尾弹出!| Tail WindowSlide[窗口向右滑动] --|2. 队头过期: 若队头索引 i - k, 从队头弹出!| Head工业级 Java 实现代码import java.util.ArrayDeque; import java.util.Deque; public class SlidingWindowMaxSolution { public int[] maxSlidingWindow(int[] nums, int k) { int n nums.length; if (n 0 || k 0) return new int[0]; int[] result new int[n - k 1]; // 双端队列存储数组下标索引 (保证下标对应的值单调严格递减) DequeInteger deque new ArrayDeque(); for (int i 0; i n; i) { // 1. 队头过期检查移除滑出当前窗口 [i-k1, i] 的旧下标 if (!deque.isEmpty() deque.peekFirst() i - k) { deque.pollFirst(); } // 2. 队尾维护单调性将所有比当前 nums[i] 小的元素全部从队尾弹出 (它们永无出头之日) while (!deque.isEmpty() nums[deque.peekLast()] nums[i]) { deque.pollLast(); } // 3. 将当前索引加入队尾 deque.offerLast(i); // 4. 记录结果当窗口形成后队头下标对应的值必然是当前窗口的最大值 if (i k - 1) { result[i - k 1] nums[deque.peekFirst()]; } } return result; } }二、单调栈实战接雨水LeetCode 42的“横向切片法”接雨水可以通过双指针纵向按列求但单调递减栈能够极其优雅地通过**“横向按凹槽切片”**计算雨水量graph TD A[单调递减栈: 遇到比栈顶高的柱子, 出现凹槽!] -- Pop[弹出栈顶作为凹槽底部 mid] Pop -- Check{弹出后栈为空?} Check --|是: 左侧无墙, 无法蓄水| Skip[跳过] Check --|否: 栈顶为左墙 left, 当前柱子为右墙 right| Calc[计算水洼高度: min(height left, height right) - height mid] Calc -- Area[水洼面积 高度 * 水平跨度 (right - left - 1)]工业级单调栈解法代码import java.util.ArrayDeque; import java.util.Deque; public class TrappingRainWaterSolution { public int trap(int[] height) { int n height.length; int totalWater 0; // 单调递减栈存储柱子的下标 DequeInteger stack new ArrayDeque(); for (int i 0; i n; i) { // 当当前柱子高于栈顶柱子时说明形成了一个凹坑洼地 while (!stack.isEmpty() height[i] height[stack.peek()]) { int mid stack.pop(); // 凹坑底部的索引 if (stack.isEmpty()) { break; // 左侧没有更高的墙水直接流走无法蓄水 } int left stack.peek(); // 左侧边界墙的索引 int right i; // 右侧边界墙的索引 // 凹槽能够蓄水的有效高度 int boundedHeight Math.min(height[left], height[right]) - height[mid]; // 凹槽的水平宽度 int distance right - left - 1; totalWater boundedHeight * distance; // 累加横向切片雨水量 } stack.push(i); } return totalWater; } }选型判断决策口诀“区间动态最值选单调队列队头控滑动窗口队尾维护单调”“左右边界极值选单调栈入栈破单调出栈算面积”实习生的算法总结单调栈与单调队列是线性时间复杂度算法中的“降维武器”。它们利用严格单调性的数学约束将原本需要两层嵌套遍历的 $\mathcal{O}(N^2)$ 暴力扫描优雅压缩为每个元素进出容器至多 1 次的严格 $\mathcal{O}(N)$。搞懂了双端队列两头淘汰的物理因果与单调栈凹槽的形成机制面对任何关于区间滑动最值与几何包络计算的难题你都能秒级写出最优解。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

Yao SUI 国际化(i18n)完整指南:翻译标记、语言包目录与 locale 检测机制 2026/9/27 8:47:42

Yao SUI 国际化(i18n)完整指南:翻译标记、语言包目录与 locale 检测机制

Agent 框架后端低代码RAG 【免费下载链接】yao ✨ All your agents and workspaces in one place, on every device you own. Track tasks on a board, accessible from desktop, mobile, browser, or API. Self-hosted. 项目地址: https://gitcode.com/gh_mirrors/…

阅读更多 →
深圳设计功能网站别乱选,源码下载后这3个坑能省2万 2026/9/27 8:47:35

深圳设计功能网站别乱选,源码下载后这3个坑能省2万

深圳设计功能网站别乱选,源码下载后这3个坑能省2万 备案流程一头雾水,是深圳很多中小企业建站时最容易卡壳的地方。很多人以为找个外包公司做网站,交钱就能万事大吉,结果最后卡在ICP备案上,或者网站上线后因为缺少源码,被服务商“卡脖子”。…

阅读更多 →
Penrose Style Collectors 深度指南:在 Style 语言中实现跨匹配聚合 2026/9/27 8:47:29

Penrose Style Collectors 深度指南:在 Style 语言中实现跨匹配聚合

开发工具数据可视化 【免费下载链接】penrose Create beautiful diagrams just by typing notation in plain text. 项目地址: https://gitcode.com/gh_mirrors/pe/penrose 点击查看 免费下载 Collectors(收集器)是 Penrose Style 语言中一类…

阅读更多 →
BFS算法解决FloodFill问题 2026/9/27 8:47:28

BFS算法解决FloodFill问题

BFS算法解决FloodFill问题图像渲染岛屿数量岛屿的最大面积被围住的区域图像渲染 题目解析:就是将这里面指定一个元素将其上下左右和这个一样的值,全部修改成另外一个值,并且其上下左右也可以进行上下左右进行扩展,也就是将这个一片…

阅读更多 →
网站被黑挂马别慌!揭秘网络广告的缺点与免费工具自救指南 2026/9/27 8:47:28

网站被黑挂马别慌!揭秘网络广告的缺点与免费工具自救指南

网站被黑挂马别慌!揭秘网络广告的缺点与免费工具自救指南 你的网站突然被挂马,页面弹出博彩广告,后台数据一片空白,这时候你该找谁?别急着打电话给那些报价五万的“安全专家”,先别慌。我干这行十年,见过太多老板因为不懂技术,被各种“安全加固”名目…

阅读更多 →
网络营销的主要形式有建设网站避坑指南 2026/9/27 8:47:15

网络营销的主要形式有建设网站避坑指南

3步搞定网络营销建设网站完整流程拒绝拖延 改个需求建站公司拖一周,这大概是每个甲方对接人最崩溃的瞬间。你急得电话打爆,对方却回复“排期满了”或“需要走流程”。别怪你脾气大,是因为你没盯着他们的 完整流程 ,只盯着了结果。很多老板觉得…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉