给定一个由 '0' 和 '1' 组成的2维矩阵,返回该矩阵中最大的由 '1' 组成的正方形的面积。输入的矩阵是字符形式而非数字形式。
数据范围:矩阵的长宽满足 ,矩阵中的元素属于 {'1','0'}
进阶:空间复杂度 , 时间复杂度
[[1,0,1,0,0],[1,0,1,1,1],[1,1,1,1,1],[1,0,0,1,0]]
4
[[1,0,0],[0,0,0],[0,0,0]]
1
# # 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 # # 最大正方形 # @param matrix char字符型二维数组 # @return int整型 # class Solution: def solve(self , matrix: List[List[str]]) -> int: # write code here if len(matrix) == 0: return 0 if len(matrix[0]) == 0: return 0 res = 0 dp = [[0 for i in range(len(matrix[0]))] for j in range(len(matrix))] for i in range(len(matrix[0])): if matrix[0][i] == '1': dp[0][i] = 1 for j in range(len(matrix)): if matrix[j][0] == '1': dp[j][0] = 1 for i in range(len(matrix)): for j in range(len(matrix[0])): if matrix[i][j] == '1': dp[i][j] = 1 min_len = min(dp[i-1][j], dp[i][j-1]) if matrix[i-min_len][j-min_len] == '1': dp[i][j] += min_len else: dp[i][j] += min_len-1 for i in range(len(matrix)): for j in range(len(matrix[0])): res = max(res, dp[i][j]) return res*res
class Solution: def solve(self , matrix: List[List[str]]) -> int: # write code here if not matrix: return 0 n=len(matrix[0]) m=len(matrix) max_len=0 dp=[[0]*(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],dp[i][j-1],dp[i-1][j-1])+1 max_len=max(max_len,dp[i][j]) return max_len*max_len
用dp[i][j]表示以matrix[i][j]为右下角的全为1组成的最大正方形的边长,则:
1. 若matrix[i][j] == 0, 则dp[i][j] = 0
2. 若matrix[i][j] == 1, 则dp[i][j] = min{dp[i-1][j], dp[i][j-1], dp[i-1][j-1]} + 1
原因可以看下面这张图: