leetcode: 柱状图中最大的矩形(单调栈*)

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

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

利用暴力查找固定高和宽,时间复杂度都是O(n^2)

这里用到一个新的思路,单调栈(单调递增栈):

1.如果新的元素比栈顶元素大,就入栈

2.如果新的元素较小, 那就一直把栈顶元素 弹出来,直到栈顶比新元素小

按照这个规则那么栈内元素会有比较明显的特点:

1. 栈内的元素是递增的

2. 当元素出栈时, 说明这个新元素是出栈元素向后找第一个比其小的元素

3. 当元素出栈后,说明栈顶元素是出栈元素向前找第一个比其小的元素

class Solution:
    def largestRectangleArea(self, heights: List[int]) -> int:
        n = len(heights)
        # 左右大于等于当前节点高度的数量
        left, right = [0] * n, [n] * n

        mono_stack = list()
        for i in range(n):
            # 当新元素小于栈顶元素并且栈不为空,出栈,出栈时统计出栈元素后边比其小的第一个的位置
            while mono_stack and heights[mono_stack[-1]] >= heights[i]:
                right[mono_stack[-1]] = i
                mono_stack.pop()
            # 新进入的元素是栈内最大的元素,栈顶是向前找第一个比它小的元素
            left[i] = mono_stack[-1] if mono_stack else -1
            mono_stack.append(i)
        
        ans = max((right[i] - left[i] - 1) * heights[i] for i in range(n)) if n > 0 else 0
        return ans

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值