LeetCode 84-柱状图中最大的矩形

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

在这里插入图片描述

输入:heights = [2,1,5,6,2,3]
输出:10
解释:最大的矩形为图中红色区域,面积为 10

解题思路:

  1. 遍历每根柱子,将当前柱子 i 的高度作为矩形的高,随后我们需要进行向左右两边扩展,使得扩展到的柱子的高度均不小于 h。即找到左右两侧最近的高度小于 h 的柱子
  2. 这样这两根柱子之间(不包括其本身)的所有柱子高度均不小于 h,并且就是 i 能够扩展到的最远范围
  3. 如果采用暴力的手段确定,会有许多重复的过程,可以使用单调栈进行优化
  4. 遍历每个柱体,若当前的柱体高度大于等于栈顶柱体的高度,就直接将当前柱体入栈
  5. 否则若当前的柱体高度小于栈顶柱体的高度,说明当前栈顶柱体找到了右边的第一个小于自身的柱体,即右边界
  6. 弹出栈顶元素作为高,此时栈顶元素就是左边界
  7. 那么就可以将栈顶柱体出栈来计算以其为高的矩形的面积了。(右边界-左边界-1)* h
class Solution {
    
    public int largestRectangleArea(int[] heights) {
    	//1. 在柱体数组的头和尾加了两个高度为0的柱体,便于计算
        int[] newArr = new int[heights.length + 2]; 
        for(int i = 0; i < heights.length; i++ ){
            newArr[i + 1] = heights[i];
        }
        newArr[0] = 0; newArr[newArr.length - 1] = 0;
		//2. 维护一个单调递增的栈
        Deque<Integer> deque = new LinkedList<>(); 
        int ans = 0;
        // 3. 计算每个位置的结果,取最大值
        for(int i = 0; i < newArr.length; i++) {
            while(!deque.isEmpty() && newArr[i] < newArr[deque.peek()]) {
                int h = newArr[deque.pop()];
                ans = Math.max(ans, (i - deque.peek() - 1) * h);
            }
            deque.push(i);
        }
        return ans;
    }
}

时间复杂度:O(N),只需要遍历两遍数组
空间复杂度:O(N),需要一个新的数据和单调栈存储数据

如果对您有所帮助的话,请点个赞吧!!!

原题链接

参考链接:
1.https://leetcode-cn.com/problems/largest-rectangle-in-histogram/solution/zhu-zhuang-tu-zhong-zui-da-de-ju-xing-by-leetcode-/
2.https://leetcode-cn.com/problems/largest-rectangle-in-histogram/solution/bao-li-jie-fa-zhan-by-liweiwei1419/

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值