吃掉LeetCode之2022/2/26

吃掉LeetCode之2022/2/26

文章目录

  • 吃掉LeetCode之2022/2/26
    • 85. 最大矩形

85. 最大矩形

给定一个仅包含 0 和 1 、大小为 rows x cols 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。

示例 1:
吃掉LeetCode之2022/2/26_第1张图片
输入:matrix = [[“1”,“0”,“1”,“0”,“0”],[“1”,“0”,“1”,“1”,“1”],[“1”,“1”,“1”,“1”,“1”],[“1”,“0”,“0”,“1”,“0”]]
输出:6
解释:最大矩形如上图所示。

示例 2:
输入:matrix = []
输出:0

示例 3:
输入:matrix = [[“0”]]
输出:0

示例 4:
输入:matrix = [[“1”]]
输出:1

示例 5:
输入:matrix = [[“0”,“0”]]
输出:0

代码思路:
这个题我们需要转化成柱状图,然后再按84. 柱状图中最大的矩形的方法解题
转化柱状图过程如下图:
吃掉LeetCode之2022/2/26_第2张图片
然后根据第上一个题的代码做就ok,我直接复制~~~~~~~

class Solution:
    def maximalRectangle(self, matrix: List[List[str]]) -> int:
        n=len(matrix[0])
        heights=[0]*n
        res=0
        for i in matrix:
            for j in range(n):
                if i[j]=='0':heights[j]=0
                else:heights[j]+=int(i[j])
            res=max(res,self.largestRectangleArea(heights))
        return res


    def largestRectangleArea(self, heights: List[int]) -> int:
        n = len(heights)
        left, right = [0] * n, [0] * n

        stack=[]
        for i in range(n):
            while stack and heights[stack[-1]]>=heights[i]:
                stack.pop()
            if stack:left[i]=stack[-1] 
            else:left[i]=-1
            stack.append(i)

        stack=[]
        for i in range(n-1,-1,-1):
            while stack and heights[stack[-1]]>=heights[i]:
                stack.pop()
            right[i]=stack[-1] if stack else n
            stack.append(i)
        
        res = max((right[i] - left[i] - 1) * heights[i] for i in range(n)) if n > 0 else 0
        return res

你可能感兴趣的:(#,力扣刷题专栏,leetcode,算法,职场和发展,栈,单调栈)