九章算法 | 直方图最大矩形覆盖

本文介绍了如何使用单调栈解决寻找直方图中最大矩形面积的问题。通过维护一个升序栈,可以有效地找出每个高度作为最低高度时的左右边界,从而计算出最大矩形面积。算法的时间复杂度和空间复杂度均为O(n)。
摘要由CSDN通过智能技术生成

给出的n个非负整数表示每个直方图的高度,每个直方图的宽均为1,在直方图中找到最大的矩形面积。

在线评测地址:LintCode 领扣

样例 1:

输入:[2,1,5,6,2,3]
输出:10
解释:
第三个和第四个直方图截取矩形面积为2*5=10。

样例 2:

输入:[1,1]
输出:2
解释:
第一个和第二个直方图截取矩形面积为2*1=2。

【题解】

算法:单调栈

思路

  • 对于每一个高度h,如果我们能够知道这个高度h作为最低高度的左右边界left和right,那么我们可以很容易的求出以高度h作为高的最大矩形面积S=(right-left+1)*h。
  • 我们能够利用单调栈很容易的获取:

1.数组内的某个元素x在这个数组内作为最小元素的最左边界/最右边界

2.数组内的某个元素x在这个数组内作为最大元素的最左边界/最右边界

  • 下面以获取元素x在数组A内作为最小元素的左边界为例:
  • 我们需要维护一个升序的单调栈。
  • 首先我们从左往右依次遍历数组A,假如此时元素为x,当栈为空或者栈顶元素小于x时,我们把x压入栈内,此时我们得到了元素x的左边界=元素x的下标;当栈内元素大于等于x时,我们不断弹出栈内的元素直到栈顶元素小于x,然后我们把x压入栈内,此时我们得到了元素x的左边界=前一个元素的下标+1,因为前一个元素是第一个小于当前元素x的。
  • 方便起见,我们直接把元素的下标压入栈内。
  • 如果我们需要得到元素x在数组A内作为最小元素的最右边界,我们只需要从右往左遍历数组,维护一个升序的栈即可。反之,如果我们要得到元素x在数组A内作为最大元素的最左边界/最右边界,我们只需要从左往右/从右往左遍历数组,维护一个降序的栈即可。

复杂度

  • 假设数组大小为n;
  • 空间复杂度O(n);
  • 时间复杂度O(n)。
public class Solution {
     
    /**
     * @param height: A list of integer
     * @return: The area of largest rectangle in the histogram
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值