单调栈解决最大矩形问题

这道题的官方难度是Hard,点赞3581,反对只有80,通过率在34.7%左右。从通过率上来看,难度其实还可以,并没有特别大,但是这道题的点赞比很高,说明题目的质量很好。实际上也的确如此,这题非常经典,我个人也非常推荐。建议大家有能力的都做一下本题,一定会很有收获。

题意
假设我们有一系列宽度相同都为1的矩形竖直地摆放在一起,请问摆放而成的这个图案所能围成的最大矩形的面积是多少?

比如上图当中,我们有6个矩形,它们的宽度都是1。我们能找到的最大矩形应该是中间5和6围成的矩形:

题目给定一个含有若干个整数的数字,表示这些矩形的高度,要求返回能找到的面积最大的矩形的面积。

样例
Input: [2,1,5,6,2,3]
Output: 10
区间求最值
拿到手应该能感受到这题的难度,我们一上来的确没有什么太好的思路,题目也比较明确,没有太多可以分析的入手点。所以我们可以先来思考一下最简单的解法。

最简单的解法就是找出能够围成的所有矩形,然后比较它们之间的面积,得出其中的最大面积。我们很容易可以想到可以遍历矩形的起始位置,这样就得到了矩形的宽。至于矩形的长也很简单,就是选定的这个区间段里的最低高度。

我们可以做一个小小的思路转换,假设这些矩形都是木条,我们是要选出木条来制作木桶。那么根据木桶效应,木桶围成的水的高度取决于最短的那根木条,同样围成矩形的面积的高取决于这些矩形当中最矮的那个。也就是说,当我们确定了区间之后,我们只需要找到区间里最小的数就可以了。所以这题就转化成了区间求最值的问题,比如上图当中,如果我们选择最后三个矩形,那么它的高度就是2。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值