markdown复制## 1. 问题背景与核心挑战
柱状图最大矩形问题(Largest Rectangle in Histogram)是LeetCode上经典的Hard级别算法题,编号84。给定n个非负整数表示柱状图的高度,每个柱子的宽度为1,求该柱状图中能勾勒出的最大矩形面积。
这个问题的暴力解法时间复杂度为O(n²),而采用单调栈(Monotonic Stack)的优化方案可以将复杂度降至O(n)。但单调栈的实现细节和边界条件处理往往成为算法面试中的"隐形杀手"——根据2023年LeetCode官方统计,该题的正确提交率不足35%,主要失分点集中在栈操作的临界条件处理。
## 2. 单调栈原理解析
### 2.1 什么是单调栈
单调栈是一种特殊的栈结构,栈内元素始终保持单调递增(或递减)的顺序。以递增栈为例:
- 新元素入栈前,会先弹出所有比它大的元素
- 弹出的过程即确定了这些元素的右边界
- 栈内相邻元素则隐含了左边界信息
```java
// 单调递增栈模板
Deque<Integer> stack = new ArrayDeque<>();
for (int i = 0; i < heights.length; i++) {
while (!stack.isEmpty() && heights[i] < heights[stack.peek()]) {
int h = heights[stack.pop()];
// 计算逻辑...
}
stack.push(i);
}
2.2 为什么单调栈有效
关键在于栈维护了"最近小于关系":
- 当元素被弹出时,当前元素就是其右边第一个更小的元素
- 弹出后栈顶元素是其左边第一个更小的元素
- 矩形宽度 = 右边界 - 左边界 - 1
这种性质使得我们可以在O(1)时间内确定任意柱子的左右边界,避免了暴力解法中的重复计算。
3. 完整算法实现与逐行解析
3.1 基础版本实现
java复制public int largestRectangleArea(int[] heights) {
Deque<Integer> stack = new ArrayDeque<>();
int m
