Leetcode 221:最大正方形(超详细的解法!!!)

在一个由 0 和 1 组成的二维矩阵内,找到只包含 1 的最大正方形,并返回其面积。

示例:

输入: 

1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0

输出: 4

解题思路

这个问题很有意思,看上去和之前的问题Leetcode 85:最大矩形(超详细的解法!!!)非常类似,所以直接在之前问题上做一点修改即可。

class Solution:
    def maximalSquare(self, matrix: List[List[str]]) -> int:
        if not matrix:
            return 0
        
        r, c = len(matrix), len(matrix[0])
        height, res = [0]*(c+1), 0
        for row in matrix:
            for i in range(c):
                height[i] = height[i] + 1 if row[i] == '1' else 0
            
            stack = [-1]
            for idx, val in enumerate(height):
                while val < height[stack[-1]]:
                    h = height[stack.pop()]
                    res = max(res, min(h, (idx - stack[-1] - 1))**2) #修改
                stack.append(idx)
        return res

但是这个问题可以直接使用动态规划,定义函数 f ( i , j ) f(i,j) f(i,j)表示位置 ( i , j ) (i,j) (i,j)为右下角的正方形的最大边长,那么

  • f ( i , j ) = m i n ( f ( i − 1 , j ) , f ( i , j − 1 ) , f ( i − 1 , j − 1 ) ) + 1 f(i,j)=min(f(i-1,j),f(i,j-1),f(i-1,j-1))+1 f(i,j)=min(f(i1,j),f(i,j1),f(i1,j1))+1
class Solution:
    def maximalSquare(self, matrix: List[List[str]]) -> int:
        if not matrix:
            return 0
            
        res, r, c = 0, len(matrix), len(matrix[0])
        mem = [[0]*c for _ in range(r)]

        for i in range(r):
            for j in range(c):
                if not i or not j or matrix[i][j] == '0':
                    mem[i][j] = int(matrix[i][j])
                else:
                    mem[i][j] = min(mem[i-1][j], mem[i-1][j-1], mem[i][j-1]) + 1
                res = max(res, mem[i][j])
        return res**2

我将该问题的其他语言版本添加到了我的GitHub Leetcode

如有问题,希望大家指出!!!

©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页