【柱状图中最大的矩形】单调栈

LeetCode 84. 柱状图中最大的矩形

计算矩形面积需要三要素,高,左端点和右端点。

高的枚举可以直接枚举每个柱子的高度,那以每个柱子为高,矩形的左右端点如何确定?

单调栈维护柱子索引,保证柱子索引递增以及栈中索引对应的柱子高度也是递增的

那么柱子左端点显而易见就是栈中前一个元素,柱子的右端点则是该柱子被弹栈时即将要插入的柱子

注意:

  1. 柱子遍历完毕后栈中剩余元素的处理
  2. 第一个柱子的左端点:无穷高的虚拟柱子(索引为-1)
点击查看代码
class Solution {
    public int largestRectangleArea(int[] heights) {
        Stack<Integer> stack = new Stack<>();
        int i = 0;
        int l, r, h;
        int ans = 0;
        while(i <= heights.length) {
            r = i;
            while(!stack.empty() && (r == heights.length || heights[stack.peek()] >= heights[i])) {
                h = heights[stack.pop()];
                l = stack.empty() ?  -1 : stack.peek();
                ans = Math.max((r - l - 1) * h, ans);
            }
            stack.push(i ++ );
        }
        return ans;
    }
}
posted @ 2024-07-17 16:26  沙汀鱼  阅读(4)  评论(0编辑  收藏  举报