LeetCode-85-Maximal Rectangle 类似上一题,n遍单调栈

本文介绍了一种求解二维矩阵中最大全'1'矩形面积的算法。该算法通过动态规划计算每行连续'1'的数量,并将其转化为柱状图问题求解最大矩形面积。最终遍历所有行并取最大值作为结果。
class Solution(object):
    def maximalRectangle(self, matrix):
        """
        :type matrix: List[List[str]]
        :rtype: int
        """
        Lenx=len(matrix)
        if Lenx==0:return 0
        Leny=len(matrix[0])
        dp=[[0 for y in range(Leny+1)]for x in range(Lenx+1)]
        for i in range(Lenx):
            for j in range(Leny-1,-1,-1):
                if matrix[i][j]=='1':
                    dp[i][j]=dp[i][j+1]+1
        
        ans=0
        
        for i in range(Leny):
            heights=[]
            for j in range(Lenx):
                heights.append(dp[j][i])
            ans=max(ans,self.largestRectangleArea(heights))
            
        return ans
    
    def largestRectangleArea(self, heights):
        """
        :type heights: List[int]
        :rtype: int
        """
        ans=0
        heights.append(0)
        stack=[]
        stack.append((0,-1))#(value,position)
        Len=len(heights)
        for i in range(Len):
            top=stack[-1]
            if heights[i]>top[0]:
                stack.append((heights[i],i))
            elif heights[i]<top[0]:
                while(heights[i]<stack[-1][0]):
                    ans=max((i-stack[-1][1])*stack[-1][0],ans)
                    p=stack[-1][1]
                    stack.pop()
                stack.append((heights[i],p))
        return ans
                    

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值