Python 11行代码解决问题:在0,1矩阵中寻找全为1正方形的最大边长或面积
def maxSquare(matrix):
'''
1 0 1 1 1
0 1 1 1 1
1 0 1 1 1
0 0 1 1 1
1 0 1 1 1
0 1 1 2 2
1 0 1 2 3
0 0 1 2 3
'''
if matrix == [] or matrix[0] == []:
return 0
m ,n = len(matrix), len(matrix[0]) # 行 # 列
maxline = 0
for i in range(1,m):
for j in range(1,n):
if matrix[i][j]:
#此步判断可省略
if matrix[i - 1][j - 1] and matrix[i][j - 1] and matrix[i - 1][j]:
matrix[i][j] = min(matrix[i - 1][j - 1], matrix[i][j - 1], matrix[i - 1][j]) + 1
maxline = max(maxline, matrix[i][j])
return maxline
k=[[1, 0, 1, 0 ,0 ],[1, 0, 1 ,1, 1 ],[1 ,1, 1, 1 ,1 ],[1 ,0, 1, 1 ,1]]
print(maxSquare(k))
原理方法: 动态规划算法变形
根据正方形的右下角判断正方形:
如果右下角为1:if matrix[i][j]:
那么判断右下角的左,上,左上元素是否为1: # 此步判断可省略
if matrix[i - 1][j - 1] and matrix[i][j - 1] and matrix[i - 1][j]:
那么矩阵边长更新: # 判断省略,直接更新边长
matrix[i][j] = min(matrix[i - 1][j - 1], matrix[i][j - 1], matrix[i - 1][j]) + 1
(最核心的代码)
记录最大边长
maxline = max(maxline, matrix[i][j])
边长更新在原来的矩阵中进行,节省空间
1 0 1 1 1
0 1 1 1 1
1 0 1 1 1
0 0 1 1 1
1 0 1 1 1
0 1 1 2 2
1 0 1 2 3
0 0 1 2 3
例如:
1 1
1 1
右下角元素matrix[1,3]为1,
1 1
1 1=ok=2
则此4个边长组成的的最大正方形边长为:min(1,1,1)+1=2
同理右下角元素matrix[1,4]为1,
1 1
1 1=ok=2
则此4个边长组成的的最大正方形边长为:min(1,1,1)+1=2
同理右下角元素matrix[2,3]为1,
1 2
1 1=ok=2
则此4个边长组成的的最大正方形边长为:min(1,2,1)+1=2
则matrix[2,3]=1,
2 2
2 1=ok= min(2,2,2)+1=3
maxline= max(2,3)=3
原文链接:https://blog.csdn.net/qq_32711799/article/details/111712996