leetcode84.柱状图中最大的矩形(java):单调栈

本文介绍了一种使用单调栈解决最大矩形面积问题的方法。通过维持一个单调递增的栈,当遇到非增元素时,计算并更新以栈顶元素为高的矩形的最大面积。最后遍历栈内剩余元素,确保所有可能的矩形面积都被计算。

题目
在这里插入图片描述
示例
在这里插入图片描述
思路
使用单调递增栈
比如[1,5,6]是递增的,那么此时栈内元素从栈顶开始是[3,2,1],此时有三种构成矩形的可能,分别是6*(4-3)、5*(4-2)、1*(4-1)
由于是单调递增,右边比左边高,所以以左边值为高时,右边可以满足条件,所以矩形的宽为当前索引减去高的索引位置。(具体这个宽怎么算要具体看你怎么设置,但大概意思就是这样)
在这里插入图片描述
总结从左往右遍历,维持栈内索引对应的值是单调递增的。一旦遇到非增,逐个抛出栈顶元素,计算以该栈顶元素为高的矩形面积,更新最大值,直到栈底,然后将当前遍历到的索引入栈。

注意如果剩下的值一直在递增,就没办法计算这些矩形的面积,所以最后要遍历一次栈内元素,计算矩形面积,直到为空,或者只剩下哨兵,或者遍历完后,再设置一个哨兵0,这样就会在最后出现减元素。

具体代码

class Solution {
    public int largestRectangleArea(int[] heights) {
        Stack<Integer> stack = new Stack<>();
        stack.push(-1);
        int maxArea = 0;
        for(int i = 0;i < heights.length;i++){
            while(stack.peek()!=-1 && heights[stack.peek()]>heights[i]){
                maxArea = Math.max(maxArea,heights[stack.pop()]*(i - stack.peek()-1));
            }
            stack.push(i);
        }
        while(stack.peek() != -1){
            maxArea = Math.max(maxArea,heights[stack.pop()]*(heights.length - stack.peek()-1));
        }
        return maxArea;
    }
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值