221. 最大正方形
image-20201117110606881
动态规划
求的是最大面积,可以转换为求最大边长。 创建一个二维数组dp dp是以i, j坐标为右下角的正方形的最大边长。 状态转移方程式: matrix[i][j] == "1"的时候: f(i, j) = min(f(i-1, j), f(i, j-1), f(i-1, j-1)) + 1 matrix[i][j] == "0"的时候,以这个位置为边的长度肯定为0: f(i, j) = 0
class Solution: def maximalSquare(self, matrix: List[List[str]]) -> int: # 判断数组是否为空 if len(matrix) == 0 or len(matrix[0]) == 0: return 0 dp = [[0 for _ in n] for n in matrix] # 定义最大边长 max_len = 0 for i in range(len(matrix)): for j in range(len(matrix[i])): # 如果i = 0 或者 j = 0 他们是靠边的,所以最多只能以他们本身为边 if i == 0 or j == 0: dp[i][j] = int(matrix[i][j]) if dp[i][j] > max_len: max_len = dp[i][j] continue if matrix[i][j] == '0': dp[i][j] = 0 else: # 找到3个之中最小的+1,因为已经确定matrix[i][j]不为'0' dp[i][j] = min(dp[i-1][j], dp[i][j-1], dp[i-1][j-1]) + 1 if dp[i][j] > max_len: max_len = dp[i][j] return max_len * max_len
需要注意的是,matrix里面的元素都是字符串不是int
image-20201117110450683