LeetCode-[单调栈]Largest Rectangle in Histogram

本文介绍了一种使用单调栈解决最大矩形面积问题的方法。通过枚举和栈操作,实现了从N2到N1的优化。文章详细解释了算法步骤,并提供了Python实现代码。

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

Link
Link
单调栈使用最经典题目。
求最大矩形面积。
N2方法是枚举起点,然后不断枚举终点,在起点固定终点右移过程中记录最短距离即可。
N1方法是使用单调栈,基于的观察是对于一个连续上升的矩形来说,若当前矩形比前一个不小于就放入队列。
因为此时最优解的终点必然可以延展到当前矩形。若当前矩形小于前一个,那前一个有可能是最优解的终点。

现在问题是,如何找到最优解的起点。

此时以 前一个矩形为终点,弹栈时,枚举栈中小于当前的矩形当作高度和起点来计算,大于的都弹栈。
栈中的数据意思是,从栈中比我小的位置开始起始到当前的最小值就是我(若栈为空,则从数组其实到当前)

这些结束后,再对栈中的数据遍历计算一遍即可。

class Solution(object):
    def largestRectangleArea(self, heights):
        """
        :type heights: List[int]
        :rtype: int
        """
        stack=[]
        ans=0
        hLen=len(heights)
        idx=0
        while idx<hLen:
            if len(stack)==0 or heights[idx]>=heights[stack[-1]]:
                stack.append(idx)
                idx+=1
            else:
                # 枚举起点和高度,结束点已经定了是idx-1的位置
                # 对于当前的数据,存在栈中的位置之前的数据肯定都是满足大于等于当前数据
                t=stack.pop()
                if not len(stack):
                    ans=max(ans,heights[t]*idx)
                else:
                    ans=max(ans,heights[t]*(idx-1-stack[-1]))

        if len(stack):
            tt=stack[-1]
        while len(stack):
            t=stack.pop()
            if not len(stack):
                ans=max(ans,heights[t]*(tt+1))
            else:
                ans=max(ans,heights[t]*(tt-stack[-1]))
        return ans
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值