在一个由 0 和 1 组成的二维矩阵内,找到只包含 1 的最大正方形,并返回其面积。
上班之余还是要保持稳定的刷题习惯。
做完本题后回忆了四道DP的题: 爬楼梯,打家劫舍,最短路径和,最大正方形。
发现动态规划思考量最大的还是动态转移方程
1.本题的关键点就是想通,状态转移方程,dp[ i ][ j ] = min(dp[ i-1 ][ j-1 ] , dp[ i-1 ][ j ] , dp[ i ][ j-1 ]) + 1, 可以结合上图想一下 边长2推出边长3的过程。
2.由于第一行第一列的元素是没有三个相邻元素来索引,所以需要构造半层padding
dp = [ [ 0 for _ in range(n+1)] for _ in range(m+1) ]
代码:
class Solution:
def maximalSquare(self, matrix: List[List[str]]) -> int:
if not matrix: return 0
m = len(matrix)
n = len(matrix[0])
dp = [[0 for _ in range(n+1)] for _ in range(m+1)]
for i in range(1,m+1):
for j in range(1,n+1):
if matrix[i-1][j-1] == '1':
dp[i][j] = min(dp[i-1][j-1],dp[i-1][j],dp[i][j-1]) + 1
maxlist = [max(row) for row in dp]
print(dp)
return max(maxlist)**2