题解 | #直方图内最大矩形#

直方图内最大矩形

http://www.nowcoder.com/practice/bfaac4eebe5947af80912d1bcfcf2baa

单调栈

一个单调递增的栈,栈内数据形成的矩形面积为

最低值(栈首)x总长度

但是输入不可能是单调递增的,因此要维持单调性,当后续值无法再入栈时必须将末尾较大的值出栈,直到新的数可以入栈。

出栈的数计算其形成的面积(高度x累积的宽度),并把出栈的个数累积为宽度,作为新入栈的数所携带的宽度数据。

每次计算面积,都更新最大面积。

# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @param heights int整型一维数组 
# @return int整型
#
    
    
def walk2(heights):#单调栈思路
    if len(heights)==0:#空列表直接返回0
        return 0
    width=[1 for _ in range(len(heights))]#记录每个位置累积的宽度,初始都为1
    stack=[0]#单调栈,记录下标
    maxSize=0#最大面积
    for i in range(1,len(heights)):
        if heights[i]>heights[stack[-1]]:#单调递增入栈
            stack.append(i)
        else:
            wide=0
            while len(stack)>0:#否则末尾出栈,直到当前值可以符合单调递增入栈条件
                last=stack.pop()
                wide+=width[last]#累加已经出栈的宽度
                maxSize=max(heights[last]*wide,maxSize)#每次出栈,计算以该出栈数为高形成的矩形面积,并更新最大面积
                if len(stack)==0 or heights[stack[-1]]<heights[i]:#找到可入栈位置或栈已经清空
                    break
            stack.append(i)#当前值入栈
            width[i]+=wide#当前值累积前面的宽度
    wide=0
    while len(stack)>0:#遍历完毕后,清理剩余在栈中的数
        last=stack.pop()
        wide+=width[last]
        maxSize=max(heights[last]*wide,maxSize)
    return maxSize
                
        
class Solution:
    def largestRectangleArea(self , heights: List[int]) -> int:
        maxSize=walk2(heights)
        return maxSize
全部评论
那如果都是单调递增的呢,不就全部入栈了吗,还有你为什么说是不能全是单调递增的,题目没有说啊
点赞 回复 分享
发布于 2022-03-10 11:18

相关推荐

11-27 12:43
已编辑
门头沟学院 C++
点赞 评论 收藏
分享
斑驳不同:还为啥暴躁 假的不骂你骂谁啊
点赞 评论 收藏
分享
沉淀一会:**圣经 1.同学你面试评价不错,概率很大,请耐心等待;2.你的排名比较靠前,不要担心,耐心等待;3.问题不大,正在审批,不要着急签其他公司,等等我们!4.预计9月中下旬,安心过节;5.下周会有结果,请耐心等待下;6.可能国庆节前后,一有结果我马上通知你;7.预计10月中旬,再坚持一下;8.正在走流程,就这两天了;9.同学,结果我也不知道,你如果查到了也告诉我一声;10.同学你出线不明朗,建议签其他公司保底!11.同学你找了哪些公司,我也在找工作。
点赞 评论 收藏
分享
评论
1
收藏
分享
牛客网
牛客企业服务