代码随想录算法训练营第六十天| 84. 柱状图中最大的矩形。

84. 柱状图中最大的矩形

题目链接:力扣

题目要求:

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

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

示例 1:

代码随想录算法训练营第六十天| 84. 柱状图中最大的矩形。_第1张图片

输入:heights = [2,1,5,6,2,3]
输出:10
解释:最大的矩形为图中红色区域,面积为 10
  • 1 <= heights.length <=105
  • 0 <= heights[i] <= 104

总结:

        本题就是遍历每一列,找到该列左边的第一个小于其高度的列,和找到右边第一个小于其高度的列,这里就是单调栈问题,是一个递减栈,每个列求出的面积的长等于右边第一个小于其高度的列-左边第一个小于其高度的列再-1,也就是抛去这两个列的中间长度,高就是中间这个列的高度,遇到小于栈顶元素的列,说明遇到了该列右边第一个小于其高度的列,栈的次栈顶,就是其左边第一个小于其高度的列,每次求出一个列的面积后,弹出该列,然后继续求别的列为中点的面积,求出最大的那个,这里遍历的所有列,首和尾需要加入两个高度为0的列,尾部的0列是为了防止如果找不到小于遍历列的高度的列的话,触发不了那个求面积公式,所以需要有一个高度小的列触发公式,首部的0高度列是为了防止heights只有一个列的情况,需要有三个列来求面积,所以首位置补充一个列。

class Solution {
    public int largestRectangleArea(int[] heights) {
        //两头加0,首加0,为了防止就两个列的情况,公式不能带入,末尾加0防止最后没找到小于遍历的高度的情况,触发不了相关操作。
        int len = heights.length;
        int[] newheights = new int[len + 2];
        newheights[0] = 0;
        newheights[len + 1] = 0;
        for(int i = 0;i < len;i++){
            newheights[i + 1] = heights[i];
        }
        heights = newheights;
        Stack stack = new Stack<>();
        stack.push(0);
        int s = 0;
        for(int i = 1;i < heights.length;i++){
            //如果遍历元素大于栈顶元素,入栈
            if(heights[i] > heights[stack.peek()]){
                stack.push(i);
            }else if(heights[i] == heights[stack.peek()]){
                stack.pop();
                stack.push(i);
            }else{
                //遍历元素小于栈顶元素,则找到了栈顶存的列的右边第一个小于其高度的列,次栈顶为其左边的
                while(heights[i] < heights[stack.peek()]){
                    int right = i;
                    int mid = stack.peek();
                    stack.pop();
                    int left = stack.peek();
                    //System.out.print(heights[left]+","+heights[right]+"\n");
                    //矩形的长取不包含左边第一个低于中间高度的列,和不包含右边第一个低于中间高度的列的中间部分
                    int w = right - left - 1;
                    int h = heights[mid];
                    s = Math.max(s,w*h);
                    //System.out.print(s+"\n");
                }
                stack.push(i);
            }
        }
        return s;
    }
}

 

你可能感兴趣的:(算法,数据结构,java,动态规划,leetcode)