题目描述
给柱状图高度,求能组成的最大矩形面积。
heights = [2,1,5,6,2,3]
输出 = 10
思路解析
关键不是背模板,而是看懂为什么这题适合单调栈。
1. 栈里保持高度递增:栈里保持高度递增
2. 高度 2 入栈:高度 2 入栈
3. 遇到 1,比 2 矮,弹出 2 结算:遇到 1,比 2 矮,弹出 2 结算
4. 5、6 递增入栈:5、6 递增入栈
5. 遇到 2,比 6 矮,弹出 6 结算:遇到 2,比 6 矮,弹出 6 结算
6. 继续弹出 5,宽度扩到 2,面积 10:继续弹出 5,宽度扩到 2,面积 10
7. 把 2 入栈,继续扫描:把 2 入栈,继续扫描
8. 末尾哨兵 0 清空栈,答案 10:末尾哨兵 0 清空栈,答案 10
把这句话记住,下次遇到同类题,就能更快选出方向。
用一个小问题检查自己是不是真的懂了。
参考代码(Python)
Python
1class Solution:
2 def largestRectangleArea(self, heights):
3 heights.append(0)
4 stack = []
5 ans = 0
6 for i, h in enumerate(heights):
7 while stack and heights[stack[-1]] > h:
8 mid = stack.pop()
9 left = stack[-1] if stack else -1
10 ans = max(ans, heights[mid] * (i - left - 1))
11 stack.append(i)
12 heights.pop()
13 return ans复杂度分析
- 时间复杂度:O(n) —— 每个核心状态按算法要求处理固定次数
- 空间复杂度:O(n) —— 只保存必要的辅助结构或递归栈
套路模板
模板不是死背,而是提醒你写代码前先把状态、转移和边界排好。
Python
1# 单调栈 通用检查表
2# 1. 定义状态/指针/容器
3# 2. 每轮只做一个清晰动作
4# 3. 更新答案并处理边界易错点
- 错误写法:只看相邻两根柱子 → 正确写法:弹栈时用左右第一个更矮确定宽度(最大矩形可能跨很多柱子)
- 错误写法:只按样例推代码 → 正确写法:先写清状态含义和边界条件(样例太少,隐藏用例专打边界)
- 错误写法:变量名和动画不一致 → 正确写法:代码变量沿用动画里的核心名字(学习时最怕脑内维护两套概念)
以上文字与上方动画完全同一思路:先看动画建立直觉 → 读文字巩固 → 关掉页面自己默写一遍代码,能写出来才算真的掌握。