栈

柱状图中最大的矩形

困难#84Java时间 O(n)空间 O(n)

题目要做什么

柱子宽度均为 1,高度由非负数组给出。求柱状图中能够覆盖的最大矩形面积。

题目示例输入heights = [2,1,5,6,2,3]
题目示例输出10

01 为什么这样做

递增栈保存还未找到右侧更矮柱子的下标。遇到更矮柱子时,弹出的柱子可以确定左右边界,面积等于高度乘可延伸宽度。末尾补一个零高度哨兵清空栈。

始终成立的条件

栈内高度严格递增;弹出时右边界已确定,新的栈顶是左侧边界。

02 看见算法执行

动画与代码同步

修改输入,播放自己的例子

当前使用题目示例
修改输入会改变执行过程;预期输出用于核对结果。
数组 / nums步骤 1
执行状态
本次演示输出播放到最后查看

Solution.java参考解法
1class Solution {2    public int largestRectangleArea(int[] heights) {3        Deque<Integer> stack = new ArrayDeque<>();4        int best = 0;5        for (int i = 0; i <= heights.length; i++) {6            int current = i == heights.length ? 0 : heights[i];7            while (!stack.isEmpty() && heights[stack.peek()] >= current) {8                int index = stack.pop();9                int left = stack.isEmpty() ? -1 : stack.peek();10                int width = i - left - 1;11                best = Math.max(best, heights[index] * width);12            }13            stack.push(i);14        }15        return best;16    }17}

键盘控制:A 后退 · D 前进

编程练习

↑↓ 选择↵ 打开Pagefind 全文检索