DAY60|84.柱状图中最大的矩形

该文章介绍了一个利用单调栈解决编程问题的算法,具体是找出柱状图中最大的矩形面积。通过创建一个单调递减的栈,遍历柱状图的高度,并计算每个柱子形成的矩形面积,从而找到最大面积。在过程中,栈用于存储柱子的索引,确保左右两侧的柱子高度小于当前柱子,从而确定矩形的宽度。
摘要由CSDN通过智能技术生成

有了之前单调栈的铺垫,这道题目就不难了。

84.柱状图中最大的矩形

class Solution {
    public int largestRectangleArea(int[] heights) {
        //相当于,找当前元素其左边比当前元素小的;再找其右边比当前元素小的。则当前元素就是高 左第一个比当前元素矮的-左第一个比当前元素矮的-1==宽
        int res=0;
        //栈内应该是单调递减 
        //栈口元素就是中间元素
        Deque<Integer> stack=new LinkedList<>();

        //heights[]中的每个元素都要作为当前元素找一下
        //于是需要在队头队尾加上0 以保证能把宽给截住
        //所以重新申请一个数组
        int[] newheights=new int[heights.length+2];
        newheights[0]=0;
        newheights[newheights.length-1]=0;
        for(int i=1;i<=newheights.length-2;i++){
            newheights[i]=heights[i-1];
        }

        heights = newheights;//因为先写了主逻辑,里面用的是heights,所以这里直接赋值就不修改主逻辑了
        
        stack.push(0);
        
        for(int i=1;i<heights.length;i++){
            //如果满足单调递减 即当前比队头大
            if(heights[i]>=heights[stack.peek()]){
                stack.push(i);
            }else{
                //不是空 0为不空 
                while(!stack.isEmpty()&&heights[i]<heights[stack.peek()]){
                    int mid=stack.peek();
                    //只会pop出作为中间元素的队头
                    mid=stack.pop();
                    //当前元素是对队头元素右边第一个比mid小的元素(不是按照height顺序来的!!!!)
                    int right=i;
                    //栈里面的是左边(过去)第一个比mid小的元素
                    int left=stack.peek();
                    int height=heights[mid];
                    int width=right-left-1;
                    res=res>height*width?res:height*width;
                }//如果当前这个元素比left还要小就继续把left当作mid
                //因为heights[]中的每个元素都要作为当前元素找一下,所以当前元素最后也要入栈
                stack.push(i);
            }
        }
        return res;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值