一.題目描述
在乙個由 0 和 1 組成的二維矩陣內,找到只包含 1 的最大正方形,並返回其面積。
示例:輸入:
1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0
輸出: 4
二.思路
動態規劃
當前元素matrix[i][j]對應的最大正方形邊長跟matrix[i-1][j],matrix[i][j-1],以及matrix[i-1][j-1]有關,是這幾個數的最小數加1
迭代公式為:
matrix[i][j]=min(matrix[i-1][j-1],matrix[i-1][j],matrix[i][j-1])+1
最終的結果為matrix中最大的正方形邊長,對應的元素不一定是matrix[m-1][n-1],m,n為行數和列數
兩個優化方法:
(1)將元素matrix[i][j]對應的最大正方形邊長存入matrix對應的位置,這樣就不需要額外的空間
(2)用乙個初始化為0的最大值max記錄最大的邊長,這樣就不用結束後還要遍歷得到matrix來最大值
(3)如果題目要求不能改變matrix的值時,只需要空間2n即可,因為當前值的最大邊長只與前一行元素對應的最大邊長有關,兩個長度為n的一維陣列,乙個記錄前一行,乙個記錄當前行
以上優化方法是動態規劃常用的優化時間空間複雜度的思路
**如下:
class solution:
def maximalsquare(self, matrix: list[list[str]]) -> int:
if matrix==:
return 0
m=len(matrix)#行數
n=len(matrix[0])#列數
max=0
if matrix[0][0]=='1' or (n>1 and matrix[0][1]=='1') or (m>1 and matrix[1][0]=='1'):
max=1
for i in range(1,m):
for j in range(1,n):
if matrix[i][j]=='1':
if int(matrix[i-1][j]) and int(matrix[i][j-1]) and int(matrix[i-1][j-1]):
matrix[i][j]=int(min(int(matrix[i-1][j-1]),int(matrix[i-1][j]),int(matrix[i][j-1]))+1)
else:
matrix[i][j]=1
if int(matrix[i][j])>max:
max=int(matrix[i][j])
return max*max
最大正方形
題目鏈結 在乙個n m的只包含0和1的矩陣裡找出乙個不包含0的最大正方形,輸出邊長。輸入格式 輸入檔案第一行為兩個整數n,m 1 n,m 100 接下來n行,每行m個數字,用空格隔開,0或1.輸出格式 乙個整數,最大正方形的邊長 輸入樣例 1 複製 4 4 0 1 1 1 1 1 1 0 0 1 1...
最大正方形
題解 if a i j 1 f i j min min f i j 1 f i 1 j f i 1 j 1 1 f i j 表示以節點i,j為右下角,可構成的最大正方形的邊長。只有a i j 1時,節點i,j才能作為正方形的右下角 對於乙個已經確定的f i j x,它表明包括節點i,j在內向上x個節...
最大正方形
最大正方形 在乙個由 0 和 1 組成的二維矩陣內,找到只包含 1 的最大正方形,並返回其面積。題解 動態規劃 使用dp i j 代表以i,j為右下角只包含1的正方形 首先需要考慮幾點 一 當前的dp i j 的值和和 i 1,j i,j 1 i 1,j 1 有關,如果當前 i,j 為1 那麼需要考...