单调栈实战:5分钟攻克LeetCode高频难题的终极套路
第一次刷到"直方图最大矩形"这道题时,我盯着屏幕发了半小时呆——明明知道要用单调栈,却死活写不出完整代码。直到在面试前一周,我终于总结出一套模板化解题框架,后来在Google面试中遇到变形题时,10分钟就写出了bug-free的代码。这篇文章将分享如何用单调栈系统化解决两类高频题型,包含可直接套用的代码模板和快速识别题眼的技巧。
1. 单调栈核心思想与解题框架
单调栈的本质是在维护栈结构的同时保持元素单调性。想象你正在整理书架,新书比最外层的书高就直接放上去(维护单调递增),否则就把矮的书抽出来直到能放入为止——这就是单调栈的物理模型。
1.1 单调栈的三种基本形态
// 单调递增栈模板
stack<int> stk;
for(int i = 0; i < n; i++) {
while(!stk.empty() && nums[i] < nums[stk.top()]) {
// 处理栈顶元素
stk.pop();
}
stk.push(i);
}
// 单调递减栈模板
while(!stk.empty() && nums[i] > nums[stk.top()]) {
// 处理逻辑
}
// 严格单调与非严格单调的区别
// 使用 <= 或 >= 实现非严格单调
关键识别特征:
- 当题目出现**"下一个更大/更小元素"**、"左右边界"、"区间极值"等关键词时
- 需要O(n)时间复杂度解决的问题(暴力法通常是O(n²))
- 涉及柱状图、矩形面积、温度变化

&spm=1001.2101.3001.5002&articleId=99187827&d=1&t=3&u=b56066ffc4284dcf9ef7a82c1bb367c1)
1349

被折叠的 条评论
为什么被折叠?



