本期任务:介绍算法中关于动态规划思想的几个经典问题
问题来源
221. 最大正方形
在一个由 0 和 1 组成的二维矩阵内,找到只包含 1 的最大正方形,并返回其面积。
示例:
输入:
1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0
输出: 4
大佬解析
笔者思路:遍历每个二维矩阵的位置,计算以该点为右下角的最大正方形的边长,发现:
- 第一行和第一列的位置仅可能为0/1,且仅取决于该位置是0/1:0->0, 1->1
- 其余位置(i, j),其值由相邻的三个位置(i-1, j),(i, j-1),(i-1, j-1)决定:
0->0, 1->min(matrix[i - 1][j], matrix[i][j - 1], matrix[i - 1][j - 1]) + 1
代码
"""
需求:
在一个由 0 和 1 组成的二维矩阵内,找到只包含 1 的最大正方形,并返回其面积。
思路:
遍历每个二维矩阵的位置,计算以该点为右下角的最大正方形面积,发现:
1. 第一行和第一列的位置仅可能为0/1,且仅取决于该位置是0/1:0->0, 1->1
2. 其余位置(i, j),其值由相邻的三个位置(i-1, j),(i, j-1),(i-1, j-1)决定:0->0, 1->min(matrix[i - 1][j], matrix[i][j - 1], matrix[i - 1][j - 1]) + 1
"""
class Solution:
def maximalSquare(self, matrix) -> int:
if not matrix:
return 0
row, col = len(matrix), len(matrix[0])
max_area = 0
# 整数化每个位置的值
for i in range(row):
for j in range(col):
matrix[i][j] = int(matrix[i][j])
if matrix[i][j]:
max_area = 1 # 因为第一行和第一列被跳过,所以需要检查是否全为0
# 直接在原矩阵上做修改,第一行和第一列故可直接跳过
for i in range(1, row):
for j in range(1, col):
if matrix[i][j] == 1:
matrix[i][j] = min(matrix[i - 1][j], matrix[i][j - 1], matrix[i - 1][j - 1]) + 1
max_area = max(max_area, matrix[i][j]**2) # 要求的是最大面积,故平方处理
return max_area