84. Largest Rectangle in Histogram

本文详细解析了一种高效算法,用于解决给定柱状图中寻找最大矩形面积的问题。通过遍历柱状图并使用栈来记录柱子的高度,算法能快速确定以每个柱子为边界时的最大矩形面积。最后,文章提供了Python实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

求在该柱状图中,能够勾勒出来的矩形的最大面积。
1
以上是柱状图的示例,其中每个柱子的宽度为 1,给定的高度为[2,1,5,6,2,3]
1
图中阴影部分为所能勾勒出的最大矩形面积,其面积为 10 个单位。

示例:

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

解法

参考:https://www.cnblogs.com/lupx/archive/2015/10/20/leetcode-85.html

最优解要么是高的,要么是矮的但是宽的
从左到右遍历到第i个bar,

  • 它比栈顶的bar还要高,那么直接入栈,并且以第i个bar的高度为高的矩形目前暂时宽度只有1。
  • 它比栈顶的bar要矮,那么我们可以宣告栈顶元素已经完成了它的任务了,因为以它的高度为高的矩形已经被我们完全搜索过了:
    1. 我们将栈顶出栈,现在我们可以算出来以栈顶元素的高度为高的矩形的宽度了,它肯定是从栈顶前一个元素的那个下标(不包括它)到i的距离(不包括i)
    2. 如果新栈顶还是比i高,那么还可以继续出栈
class Solution(object):
    def largestRectangleArea(self, heights):
        """
        :type heights: List[int]
        :rtype: int
        """
        n = len(heights)
        stack = []
        ans = 0
        for i,h in enumerate(heights):
            while len(stack) and h<heights[stack[-1]]:
                j = stack.pop()
                b = stack[-1]+1 if len(stack) else 0
                ans = max(ans, heights[j]*(i-b))
            stack.append(i)
        while len(stack):
            j = stack.pop()
            b = stack[-1]+1 if len(stack) else 0
            ans = max(ans, heights[j]*(n-b))
        return ans
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值