class Solution:
def findSquare(self, matrix: List[List[int]]) -> List[int]:
ans = [0,0,0]
n = len(matrix)
if n == 0:
# 空矩阵
return []
if n == 1:
# 矩阵1x1:一个元素
if matrix[0][0] == 0:
return [0,0,1]
else:
return []
dp = [[[0,0] for _ in range(n)] for _ in range(n)]
for i in range(n-1,-1,-1):
for j in range(n-1,-1,-1):
# 统计当前元素下边有多少0 [i][j][1]
# 统计当前元素右边有多少0 [i][j][0]
if matrix[i][j] == 1:
dp[i][j][0] = dp[i][j][1] = 0
else:
if i < (n-1):
dp[i][j][1] = dp[i+1][j][1] + 1
else:
dp[i][j][1] = 1
if j < (n-1):
dp[i][j][0] = dp[i][j+1][0] + 1
else:
dp[i][j][0] = 1
# 判断当前位置,最大子矩阵,只能是“右边0个数和下边0个数的最小值”
size = min(dp[i][j][0],dp[i][j][1])
# 判断 右上角和左下角坐标是否满足方阵条件,也就是判断左下角的右边0是否大于size,右上角的下边0是否大于size
while size >= ans[2]:
# 选取最大的
if dp[i+size-1][j][0] >= size and dp[i][j+size-1][1]>=size:
ans = [i,j,size]
break
else:
size -= 1
return ans
每日一道Leetcode - 面试题 17.23. 最大黑方阵 【最大子矩阵系列|动态规划】
最新推荐文章于 2022-10-25 19:02:03 发布