跳至主要內容

0221. 最大正方形

ITCharge大约 2 分钟

0221. 最大正方形open in new window

  • 标签:数组、动态规划、矩阵
  • 难度:中等

题目链接

题目大意

描述:给定一个由 '0''1' 组成的二维矩阵 matrixmatrix

要求:找到只包含 '1' 的最大正方形,并返回其面积。

说明

  • m==matrix.lengthm == matrix.length
  • n==matrix[i].lengthn == matrix[i].length
  • 1m,n3001 \le m, n \le 300
  • matrix[i][j]matrix[i][j]'0''1'

示例

  • 示例 1:
输入:matrix = [["1","0","1","0","0"],["1","0","1","1","1"],["1","1","1","1","1"],["1","0","0","1","0"]]
输出:4
  • 示例 2:
输入:matrix = [["0","1"],["1","0"]]
输出:1

解题思路

思路 1:动态规划

1. 划分阶段

按照正方形的右下角坐标进行阶段划分。

2. 定义状态

定义状态 dp[i][j]dp[i][j] 表示为:以矩阵位置 (i,j)(i, j) 为右下角,且值包含 11 的正方形的最大边长。

3. 状态转移方程

只有当矩阵位置 (i,j)(i, j) 值为 11 时,才有可能存在正方形。

  • 如果矩阵位置 (i,j)(i, j) 上值为 00,则 dp[i][j]=0dp[i][j] = 0
  • 如果矩阵位置 (i,j)(i, j) 上值为 11,则 dp[i][j]dp[i][j] 的值由该位置上方、左侧、左上方三者共同约束的,为三者中最小值加 11。即:dp[i][j]=min(dp[i1][j1],dp[i1][j],dp[i][j1])+1dp[i][j] = min(dp[i - 1][j - 1], dp[i - 1][j], dp[i][j - 1]) + 1
4. 初始条件
  • 默认所有以矩阵位置 (i,j)(i, j) 为右下角,且值包含 11 的正方形的最大边长都为 00,即 dp[i][j]=0dp[i][j] = 0
5. 最终结果

根据我们之前定义的状态, dp[i][j]dp[i][j] 表示为:以矩阵位置 (i,j)(i, j) 为右下角,且值包含 11 的正方形的最大边长。则最终结果为所有 dp[i][j]dp[i][j] 中的最大值。

思路 1:代码

class Solution:
    def maximalSquare(self, matrix: List[List[str]]) -> int:
        rows, cols = len(matrix), len(matrix[0])
        max_size = 0
        dp = [[0 for _ in range(cols + 1)] for _ in range(rows + 1)]
        for i in range(rows):
            for j in range(cols):
                if matrix[i][j] == '1':
                    if i == 0 or j == 0:
                        dp[i][j] = 1
                    else:
                        dp[i][j] = min(dp[i - 1][j - 1], dp[i - 1][j], dp[i][j - 1]) + 1
                    max_size = max(max_size, dp[i][j])
        return max_size * max_size

思路 1:复杂度分析

  • 时间复杂度O(m×n)O(m \times n),其中 mmnn 分别为二维矩阵 matrixmatrix 的行数和列数。
  • 空间复杂度O(m×n)O(m \times n)