leetcode84柱状图中最大的矩形

单调栈的应用:
用一个栈维护顺序,按照单调增或者减的顺序,一旦遇到不按照单调规律的值,就不断的弹出,直至栈顶元素和要入栈的元素满足单调关系。在这个过程中进行某种计算,最终得到想要的值。

public int largestRectangleArea(int[] heights){
        int len = heights.length;
        if (len == 0) {
            return 0;
        }
        if(len == 1){
            return heights[0];
        }

        int area = 0;
        int[] newHeights = new int[len+2];
        for(int i=0; i<len; i++){
            newHeights[i+1] = heights[i];
        }
        len += 2;
        heights = newHeights;

        Deque<Integer> stack = new ArrayDeque<>();
        stack.addLast(0);

        for(int i=1; i<len; i++){
            while(heights[stack.peekLast()] > heights[i]){
                int height = heights[stack.removeLast()];
                int width = i - stack.peekLast() -1;
                area = Math.max(area, width * height);
            }
            stack.addLast(i);
        }
        return area;
    }

对于某种高度(栈顶元素),只需要确定他的左右边界。那么我们保证栈中的元素按照单调增。那么栈顶元素的左边界就是挨着它的元素,右边界就是这个即将入栈,并且小于栈顶的元素。

在头和尾都放置了0。头部的作用是,不用判断栈是否为空了,应为永远不会为空。尾部的作用是使栈内的元素全部弹出(防止高度最小的,没有参与计算)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值