题解
思路
代码
class Solution:
### 0105 动态规划(96 ms,20.4 MB)
def maximalSquare(self, matrix: List[List[str]]) -> int:
if not matrix: return 0
length = 0
m, n = len(matrix), len(matrix[0])
# 给dp多加一行一列的0,用于计算方便
# dp[i][j]表示以(i,j)为右下角的正方形的最大边长
dp = [[0] * (n + 1) for _ in range(m + 1)]
# 从matrix的第1行,第一列开始遍历
for i in range(1, m + 1):
for j in range(1, n + 1):
# 判断matrix中当前的值[i - 1][j - 1]是否为1
if matrix[i - 1][j - 1] == '1':
# dp中当前的值[i][j]取决于左、上、左上3个方向的值(短板效应)
dp[i][j] = min(dp[i - 1][j - 1], dp[i - 1][j], dp[i][j - 1]) + 1
# 更新正方形最大边长
length = max(length, dp[i][j])
return length ** 2 # 正方形的面积 = 边长的平方
### 0105 动态规划 + 空间优化(84 ms,20.1 MB)
def maximalSquare(self, matrix: List[List[str]]) -> int:
if not matrix: return 0
res = pre = 0
m, n = len(matrix), len(matrix[0])
dp = [0] * (n+1)
for i in range(0, m):
for j in range(1, n+1):
tmp = dp[j]
if matrix[i][j-1] == "1":
dp[j] = min(dp[j], dp[j-1], pre) + 1
res = max(dp[j], res)
else:
dp[j] = 0
pre = tmp
pre = 0
return res ** 2