【动态规划】No. 0221 最大正方形【中等】👉力扣对应题目指路
希望对你有帮助呀!!💜💜 如有更好理解的思路,欢迎大家留言补充 ~ 一起加油叭 💦
欢迎关注、订阅专栏 【力扣详解】谢谢你的支持!
⭐ 题目描述:在一个由 ‘0’ 和 ‘1’ 组成的二维矩阵内,找到只包含 ‘1’ 的最大正方形,并返回其面积。
- 示例: 如下二维矩阵,返回 2x2=4
🔥 思路:采用动态规划,建立二维 dp 数组,利用每个元素左上角的 dp 数组推导其自身 dp 值
参考如上思路,给出详细步骤如下:
- 步骤一⭐确定 dp 数组含义:二维 dp 数组
dp[i][j]
的含义为:以matrix[i][j]
为右下角的最大正方形的边长 【💥 重要】- 步骤二⭐确定 dp 推导方式:由自身左上的元素推导得到
- 如果当前对应
matrix[i][j]
中的值为0
,说明以matrix[i][j]
为右下角的最大正方形的边长为0
→dp[i][j]=0
- 如果当前对应
matrix[i][j]
中的值非0
,则为 上、左、左上、三者对应的最小正方形边长 + 1:min(dp[i-1][j], dp[i][j-1], dp[i-1][j-1]) + 1
- 从特例理解:三者相等均为 dp[i-1][j-1]:当前
matrix[i][j]
补齐了新大正方形的右下角 ◲min
: 不相等时,只能维持最短的边长,所以取min
- +1:由于
matrix[i][j]
处的1
拓展了一个单位的边长- 步骤三⭐根据 dp 数组含义,初始化 dp 数组:完全 copy
matrix
中的值即可
- 由左上角推导,所以只需要关注最左侧、最上侧的
dp
初值
matrix
中为0
说明对应的最大正方形边长为0
matrix
中为1
说明对应的最大正方形边长为1
- 根据推导公式,其他位置得初值会被覆盖、任意数均可(本代码中直接 copy 了
matrix
)
class Solution:
def maximalSquare(self, matrix: List[List[str]]) -> int:
result = 0
dp = [[] for i in range(len(matrix))] # ------------------------------- step 1
for i in range(len(matrix)): ## 填充 dp 初值 # ------------------------ step 3
for j in range(len(matrix[0])):
dp[i].append(int(matrix[i][j]))
if matrix[i][j] == "1" and result == 0: ## 更新 result 初值
result = 1
# -------------------------------------------------------------------- step 2
for i in range(1,len(matrix)):
for j in range(1,len(matrix[0])):
if matrix[i][j] == "0": # ----------------------------------- step 2.1
# 不需要更新,还是保持 0
continue ## 注意是 continue
dp[i][j] = min(dp[i-1][j], dp[i][j-1], dp[i-1][j-1]) + 1 # -- step 2.2
result = max(result, dp[i][j])
return result**2
希望对你有帮助呀!!💜💜 如有更好理解的思路,欢迎大家留言补充 ~ 一起加油叭 💦
欢迎关注、订阅专栏 【力扣详解】谢谢你的支持!
🔥 LeetCode 热题 HOT 100