python正方形最大矩阵算法_潇洒郎:Python 11行代码解决问题:在0,1矩阵中寻找全为1的正方形的最大边长或面积...

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值