leetcode解题之柱状图中最大的矩形

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

求在该柱状图中,能够勾勒出来的矩形的最大面积。
在这里插入图片描述
以上是柱状图的示例,其中每个柱子的宽度为 1,给定的高度为 [2,1,5,6,2,3]。

在这里插入图片描述

图中阴影部分为所能勾勒出的最大矩形面积,其面积为 10 个单位。

示例:

输入: [2,1,5,6,2,3]
输出: 10

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/largest-rectangle-in-histogram
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

最容易想到的是暴力的解法,以当前柱体为高,找到当前柱体左右两边绝对小于当前柱体高度的柱体下标,然后再以下标中间部分为边长,即可算出矩形的面积,以次遍历柱体,计算出最大面积

class Solution {
    public int largestRectangleArea(int[] heights) {
        int len = heights.length;
        int area = 0;
        //暴力解法
        for(int i=0;i<len;i++){
           int left=i,right=i;
            int bottomWidth = 0;
           while(left>=0){
               if(heights[left]<heights[i]){
                   break;
               }
                left--;
           }
            while(right<len){
                if(heights[right]<heights[i]){
                    break;
                }
                right++;    
            }
            bottomWidth = right-left-1;
            area = Math.max(area,bottomWidth*heights[i]);
        }
        return area;
    }
}

下面是官方的解法

使用栈空间换时间,遍历数组,然后计算小于栈顶元素时柱体所形成的矩形的面积,高度为栈顶元素高度,底边为当前柱体到次栈顶元素的距离

class Solution {
    public int largestRectangleArea(int[] heights) {
        int len = heights.length;
        int area = 0;
        //使用栈,保存数组下标
        Deque<Integer> stack = new ArrayDeque<>();
        //使用哨兵
        int[] nums = new int[len+2];
        for(int i=0;i<len;i++){
            nums[i+1] = heights[i];
        }
        len+=2;
        heights = nums;
        stack.addLast(0);
        for(int i=0;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
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值