【leetcode】85. 最大矩形

毫无头绪。。

看了答案才会做。原来就是单调栈的变种

创建一个新的矩形,里面的数字代表左边连续1的数量

那么,对于

[["1","0","1","0","0"],

["1","0","1","1","1"],

["1","1","1","1","1"],

["1","0","0","1","0"]]

这个矩阵,可以化为

1 0 1 0 0
1 0 1 2 3
1 2 3 4 5
1 0 0 1 0
这样只需对每一列运用84题中的方法即可求出答案
'''
1 0 1 0 0
1 0 1 2 3
1 2 3 4 5
1 0 0 1 0
[0,0],[2,2]
[0,0],[2,4]
[0,4]
[0,0],[3,3]
'''

class Solution:
    def maximalRectangle(self, matrix: List[List[str]]) -> int:
        ret = 0
        m = len(matrix)
        n = len(matrix[0])
        newMatrix = [[0] * n for _ in range(m)]
        for i in range(m):   
            add = 0
            for j in range(n):
                if matrix[i][j] == '0':
                    add = 0
                else:
                    add = add + 1
                newMatrix[i][j] = add
        newMatrix.append([0] * n)
        for i in range(n):
            s = [-1]
            for j in range(m + 1):
                cur = newMatrix[j][i]
                while len(s) != 0 and newMatrix[s[-1]][i] > cur:
                    height = newMatrix[s[-1]][i]
                    s.pop()
                    left = s[-1] if len(s) != 0 else 0
                    right = j
                    ret = max(ret, height * (right - left - 1))
                s.append(j)
        return ret

 

posted @ 2022-09-09 14:29  gogslow  阅读(28)  评论(0)    收藏  举报