柱状图中最大的矩形

题目:
给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。

求在该柱状图中,能够勾勒出来的矩形的最大面积。

柱状图中最大的矩形_出栈


以上是柱状图的示例,其中每个柱子的宽度为 1,给定的高度为 [2,1,5,6,2,3]。

柱状图中最大的矩形_Math_02


图中阴影部分为所能勾勒出的最大矩形面积,其面积为 10 个单位。

示例:

输入: [2,1,5,6,2,3]
输出: 10

解题思路:用栈来记录数组下标,当栈顶高度大于当前遍历的数组元素高度时则栈顶元素的面积可以确定,此时出栈求出栈顶元素面积,以此类推

class Solution {
    public int largestRectangleArea(int[] heights) {
        int len = heights.length;
        Stack<Integer> stack = new Stack();
        int area = 0;
        for(int i = 0; i < len; i++) {
        	// 栈顶元素大于当前遍历元素
            while(!stack.isEmpty() && heights[stack.peek()] > heights[i]) {`
                int height = heights[stack.pop()];
                // 相同高度相邻
                while(!stack.isEmpty() && heights[stack.peek()] == height) {
                    stack.pop();
                }
                int width = 0;
                if(stack.isEmpty()) {
                    width = i;
                } else {
                    width = i - stack.peek() - 1;
                }
                area = Math.max(area, width * height);
            }
            stack.push(i);
        }
        
        while(!stack.isEmpty()) {
            int height = heights[stack.pop()];
            while(!stack.isEmpty() && heights[stack.peek()] == height) {
                stack.pop();
            }
            int width = 0;
            if(stack.isEmpty()) {
                width = len;
            } else {
                width = len - stack.peek() - 1;
            }
            area = Math.max(area, width * height);
        }
        
        return area;
    }
}