刷题12.10

1 柱状图中的最大矩阵

题目

给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。
求在该柱状图中,能够勾勒出来的矩形的最大面积。

代码

class Solution {
    public int largestRectangleArea(int[] heights) {
        int len=heights.length;
        int[] minleft=new int[len];
        int[] minright=new int[len];
        minleft[0]=-1;
        for(int i=1;i<len;i++){
            int t=i-1;
            while(t>=0 && heights[t]>=heights[i]) t=minleft[t];
            minleft[i]=t;
        }
        minright[len-1]=len;
        for(int i=len-2;i>=0;i--){
            int t=i+1;
            while(t<len && heights[t]>=heights[i]) t=minright[t];
            minright[i]=t;
        }
        int res=0;
        for(int i=0;i<len;i++){
            int sum=heights[i]*(minright[i]-minleft[i]-1);
            res=Math.max(res,sum);
        }
        return res;

    }
}

总结

虽然做了接雨水,这道题和它很相似。
但我没想明白的是sum = heights[i] * (minRightIndex[i] - minLeftIndex[i] - 1);
然后我根据代码自己手算一遍,还真的是这样。
单调栈(⊙﹏⊙),下次看吧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值