【LeetCode】84. Largest Rectangle in Histogram

题目描述

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

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

【LeetCode】84. Largest Rectangle in Histogram_第1张图片

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

【LeetCode】84. Largest Rectangle in Histogram_第2张图片

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

示例:

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

思路: 我们可以从左到右遍历所有bar, 并将其push到一个stack中, 如果当前bar的高度小于栈顶bar, 我们pop出栈顶的bar, 同时以该bar计算矩形面积。 那么我们如何知道该bar的起点和终点呢呢?终点铁定就是当前遍历到的bar 的索引, 而起点则是当前的栈顶bar的索引, 因为此时栈顶bar的高度一定小于pop出来的bar的高度。

   
public int largestRectangleArea(int[] heights) {
        if (heights == null || heights.length == 0) return 0;
        //栈里存储的数字都是升序,存储的都是数组的下标
        LinkedList<Integer> stack = new LinkedList<>();
        int res = 0;
        for (int i = 0; i <= heights.length ; i++){
            //i == heights.length时赋值为0
            int h = i == heights.length ? 0 : heights[i];
            //只要栈里还存有数组且当前的h小于栈顶的数字
            //开始计算面积
            while (!stack.isEmpty() && h < heights[stack.peek()]){
                //矩形的高度
                int height = heights[stack.pop()];
                //矩形的起点
                int start = stack.isEmpty() ? -1 : stack.peek();
                int area = (i - start - 1) * height;
                res = Math.max(res, area);
            }
            stack.push(i);
        }
        return res;
    }

你可能感兴趣的:(编程语言,LeetCode)