最大正方形

2021-09-26 02:00:17 字數 1403 閱讀 1093

一.題目描述

在乙個由 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 那麼需要考...