84. Largest Rectangle in Histogram

Given n non-negative integers representing the histogram's bar height where the width of each bar is 1, find the area of largest rectangle in the histogram.


84. Largest Rectangle in Histogram_第1张图片

Above is a histogram where width of each bar is 1, given height = [2,1,5,6,2,3]
.

84. Largest Rectangle in Histogram_第2张图片

The largest rectangle is shown in the shaded area, which has area = 10
unit.

For example,

Given heights = [2,1,5,6,2,3],
return 10.

一刷
题解:
思路一
保证stack内的元素都是升序。
遍历heights数组,如果大于栈顶元素,就push进去;否则,持续弹栈来计算从栈顶点到降序点的矩阵大小。为局部最大值

public class Solution {
    public int largestRectangleArea(int[] height) {
        int len = height.length;
        Stack s = new Stack();
        int maxArea = 0;
        for(int i = 0; i <= len; i++){
            int h = (i == len ? 0 : height[i]);
            if(s.isEmpty() || h >= height[s.peek()]){
                s.push(i);
            }else{
                int tp = s.pop();
                maxArea = Math.max(maxArea, height[tp] * (s.isEmpty() ? i : i - 1 - s.peek()));
                i--;
            }
        }
        return maxArea;
    }
}

注意⚠️:
思路:当前高度比peek小,则以peek高度为基准,不断pop直至stack中的元素都小与当前(保证站内元素递增)

  1. 在最后push了一个0,保证最后一个可以陆续pop出来计算面积。
  2. i--的用意是,不停pop直至stack中的元素都小与当前(重新进入for loop)
  3. 高度用i - 1 - s.peek()的用意是,height[s.peek() + 1] >= height[tp]当前在栈顶的元素是tp左边的元素中第一个小于tp的。然而s.peek() + 1是大于tp的
    ps:不在栈中的都比cur的高度要高

思路二
用栈来模拟,遍历heights数组,如果大于栈顶元素,就push进去;否则,持续弹栈来计算从栈顶点到降序点的矩阵大小。然后将这一部分全部替换为降序点的值,即做到了整体依然是有序非降的。
整个过程中,即把所有的局部最大矩阵计算过了,又在宽度范围内保留了全部的场景。
举例,2,1,5,6,3的场景。
1). 先加入一个0,方便最后可以全部弹栈出来。变成:2,1,5,6,3,0.
2). 2进栈,1比栈顶小,对2进行出栈,area = 2;
3). 2被替换为1进栈,1继续进栈,这是栈为1,1;
4). 5,6都是非降的,继续进栈,栈为1,1,5,6;
5). 遇到3,是一个降序点;开始弹栈,6出栈,对应area=61; 5出栈对应area=52;下一个1比3小,不需要弹栈。然后将5、6的弹栈后的空位压栈为3,这是栈为1,1,3,3,3;
6). 下一步遇到0,开始依次出栈,得到area=31,32,33,14,1*5。
7). 遍历结束。整个过程中max的area为10.

在整个过程中,将每一个点作为起点,到各个波峰最大的几个矩阵都计算过一次,即保证了每个点作为起点的最大矩阵可能性都试探过。

你可能感兴趣的:(84. Largest Rectangle in Histogram)