python-leetcode 72.柱形图中的最大矩形

题目:

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

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


 单调栈

要找到柱状图中的最大矩形面积,可以理解为对于每一个柱子,找到以它的高度为矩形高度的最大宽度,这个宽度由柱子左右两边第一个比它矮的柱子的位置决定。

具体来说:

对于柱子i,其高度为height[i]

向左找到第一个比heights[i]小的柱子的位置left

向右找到第一个比hseights[i]小的柱子的位置right

以heights[i]为高度的最大矩形面积为heights[i]*(right-left-1)

class Solution(object):
    def largestRectangleArea(self, heights):
        """
        :type heights: List[int]
        :rtype: int
        """
        stack=[] #初始化一个空栈stack,用于存储柱子的索引,栈中的索引对应的高度是单调递增的
        max_area=0 #记录当前找到的最大矩形面积
        heights.append(0)#添加一个高度为0的柱子,确保所有的柱子都能被处理
        for i ,h in enumerate(heights): #遍历柱子高度列表,i是当前柱子索引,h是当前柱子高度
            while stack and h<heights[stack[-1]]:  #当栈不为空且当前柱子高度小于栈顶柱子高度时,进入循环(找到了右边界)
                height=heights[stack.pop()] #弹出栈顶元素,并获取该柱子的高度
                width=i if not stack else i-stack[-1]-1  #如果栈为空,宽度就是当前索引i(从开始到当前位置),宽度是当前索引i减去新的栈顶索引再减1
                max_area=max(max_area,height*width)
            stack.append(i)
        return max_area

时间复杂度:O(n)

空间复杂度:O(n)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值