[leetcode] 84. 柱状图中最大的矩形

84. 柱状图中最大的矩形

用到了单调栈的知识,还是第一次碰到。学习了好久

看这两篇文章吧:
直方图中最大的矩形
单调栈小结

简单来说,维护一个单调栈,如果当前元素大于栈顶元素,则把当前元素的坐标入栈,否则,弹出栈顶元素直到当前元素可入栈。

在栈顶元素弹出时,把弹出的元素当成最短木板,计算能组成的最大面积是多少。根据单调栈的性质:max = Math.max(max, heights[tmp] * (stack.empty() ? i : i - stack.peek() - 1));
组成矩阵的高度为当前弹出的栈顶元素:heights[tmp],而宽度则为(stack.empty() ? i : i - stack.peek() - 1)

class Solution {
    public int largestRectangleArea(int[] heights) {
        if (heights.length == 0) return 0;
        Stack<Integer> stack = new Stack<>();

        int max = 0;
        for (int i = 0; i < heights.length; i++) {
            while (!stack.isEmpty() && heights[stack.peek()] >= heights[i]) {
                int tmp = stack.pop();
                // 把当前的tmp木板作为最短木板,看能组成的最大面积是多少
                max = Math.max(max, heights[tmp] * (stack.empty() ? i : i - stack.peek() - 1));
            }
            stack.push(i);
        }

        int tmp = 0;
        int len = heights.length;
        while (!stack.isEmpty()) {
            tmp = stack.pop();
            max = Math.max(max, heights[tmp] * (stack.empty() ? len : len - stack.peek() - 1));
        }

        return max;
    }
}
posted @ 2018-07-30 22:21 ACBingo 阅读(...) 评论(...) 编辑 收藏