1. 问题背景与核心挑战
柱状图最大矩形问题(Largest Rectangle in Histogram)是LeetCode上经典的Hard级别算法题,编号84。给定n个非负整数表示柱状图的高度,每个柱子的宽度为1,求该柱状图中能够勾勒出的最大矩形面积。这个问题在数据可视化、图像处理、城市规划等领域都有实际应用场景。
我第一次遇到这个问题时,暴力解法的时间复杂度是O(n²),这在LeetCode上会导致超时。后来发现单调栈(Monotonic Stack)才是解决这类问题的银弹。单调栈通过维护一个有序的栈结构,可以将时间复杂度优化到O(n),空间复杂度O(n)。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 单调栈原理解析
2.1 什么是单调栈
单调栈是一种特殊的栈结构,栈内元素保持单调递增或单调递减的顺序。在解决柱状图问题时,我们通常使用单调递增栈(栈底到栈顶元素值递增)。这种数据结构特别适合处理"寻找下一个更大/更小元素"这类问题。
单调栈的工作机制可以类比排队买票的场景:假设新来的人比队伍末尾的人高,就直接排在后面;如果比末尾的人矮,就让末尾的人出列,直到找到合适的位置。这个过程正好对应了柱状图中矩形边界的确定。
2.2 算法正确性证明
为什么单调栈能解决这个问题?关键在于它能高效地找到每个柱子左右两侧第一个比它矮的柱子(称为边界)。对于柱子i,最大矩形面积就是height[i] × (right_boundary - left_boundary - 1)。
通过维护单调递增栈,当遇到一个比栈顶元素矮的柱子时,栈顶元素找到了它的右边界,而它在栈中的前一个元素就是左边界。这个过程确保了每个柱子入栈和出栈各一次,时间复杂度O(n)。
3. Java实现详解
3.1 基础实现代码
java复制public int largestRectangleArea(int[] heights) {
Stack<Integer> stack = new Stack<>();
int maxArea = 0;
int n = heights.length;
for (int i = 0; i <= n; i++) {
int h = (i == n) ? 0 : heights[i];
