84柱状图中最大的矩形

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

求在该柱状图中,能够勾勒出来的矩形的最大面积。

以上是柱状图的示例,其中每个柱子的宽度为 1,给定的高度为 [2,1,5,6,2,3]。

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

示例:

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

 

解题思路:

方案一:

从左到右,遍历每一个矩形高度,当指针到达某一节点K时,以这个节点为高的矩形,必须满足的条件是:左边和右边连续的高度要大于等于该节点的高,通过这种方式可以计算出所有节点为高度的时候的最大的面积,最后算出所有节点高最大面积的最大值即为最大面积。

这种遍历时间复杂度为:n^2

方案二:

思路和第一个类似,只不过借用了栈的思路,顺序遍历每个节点,当高度递增,则分别入栈,直到遇到第一个高度下降的节点,则开始计算栈顶元素为高的矩形,由于栈顶元素的左边和右边都小于栈顶元素,所以面积为heights[top] * [current-(top-1)-1]。计算完毕后出栈top,再计算top-1元素和当前元素相比的高度,如果大于等于当前元素,则top-1为高的面积是:heights[top-1]*[currnet-(top-2)-1],依次类推。知道栈顶元素不再大于当前元素,或者栈已经空了,则继续向后执行。

 public int largestRectangleArea(int[] heights) {
        Stack<Integer> stack = new Stack<Integer>();
        stack.push(-1);
        int max = 0;
        for(int i=0;i<heights.length;i++){
            while(stack.peek()!=-1&&heights[stack.peek()]>heights[i]){
                max = Math.max(max,heights[stack.pop()]*(i-stack.peek()-1));
            }
            stack.push(i);
        }
        while(stack.peek()!=-1){
            max = Math.max(max,heights[stack.pop()]*(heights.length-stack.peek()-1));
        }
        return max;
    }

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值