力扣解題思路 221 最大正方形

2021-10-25 09:52:30 字數 1511 閱讀 5478

思路:在乙個由 『0』 和 『1』 組成的二維矩陣內,找到只包含 『1』 的最大正方形,並返回其面積。

輸入:

matrix =[[

"1",

"0",

"1",

"0",

"0"],[

"1",

"0",

"1",

"1",

"1"],[

"1",

"1",

"1",

"1",

"1"],[

"1",

"0",

"0",

"1",

"0"]

]輸出:4

每當看到這種正方形或者矩形的題目,都會形成一種本能的反應,就是找到兩個點,即左上和右下頂點,因為固定這兩個點,整個正方形也就固定了。

首先採用暴力法,也就是對每乙個點,遍歷其可能出現的所有正方形的長度,返回滿足條件的最長的就可以了:

public

intmaximalsquare

(char

matrix)

public

intfunction

(char

matrix,

int i,

int j)

return m * m;

}

另一種方式就是動態規劃,這需要我們發現乙個規律來更新動態方程,我們定義dp[i][j]表示以第i行第j列為右下角所能構成的最大正方形邊長,那麼如何更新呢?

當我們判斷以某個點為正方形右下角時最大的正方形時,那它的上方,左方和左上方三個點也一定是某個正方形的右下角,否則該點為右下角的正方形最大就是它自己了。這是定性的判斷,那具體的最大正方形邊長呢?我們知道,該點為右下角的正方形的最大邊長,最多比它的上方,左方和左上方為右下角的正方形的邊長多1,最好的情況是是它的上方,左方和左上方為右下角的正方形的大小都一樣的,這樣加上該點就可以構成乙個更大的正方形。 但如果它的上方,左方和左上方為右下角的正方形的大小不一樣,合起來就會缺了某個角落,這時候只能取那三個正方形中最小的正方形的邊長加1了。假設dpi表示以i,j為右下角的正方形的最大邊長,則有 :

dp[i][j] = min(dp[i-1][j-1], dp[i-1][j], dp[i][j-1]) + 1

舉個例子,如果dp[i-1][j-1], dp[i-1][j], dp[i][j-1]位置其中有乙個位置為0,都是證明無法構成正方形的,因此dp[i][j] = 0+1 = 1,也就是只有自身的乙個正方形,同樣的道理,再舉個例,如果dp[i-1][j-1], dp[i-1][j], dp[i][j-1]分別為123,那麼無論如何都是可以構成2乘2的正方形的,畫個圖就可以清晰明了啦~~

**很簡單,也不需要初始化陣列,因為其他位置預設為0就可以啦:

public

intmaximalsquare

(char

matrix)}}

return max*max;

}

221 最大正方形 力扣

題意理解 求m n矩陣中,每個元素取值只有0,1,求元素1組成的最大正方形面積 問題分析 用動規狀態量 以每個元素為右下角的矩陣的最大邊長 轉移方程 對於a i j dp i j min dp i 1 j dp i j 1 dp i 1 j 1 1 表示對於每個非0的矩陣元素,計算它相鄰的左元素,上...

力扣221 最大正方形

這道題主要是利用動態規劃,注意好邊界條件,就可以解決。在乙個由 0 和 1 組成的二維矩陣內,找到只包含 1 的最大正方形,並返回其面積。示例 輸入 1 0 1 0 0 1 0 1 1 1 1 1 1 1 1 1 0 0 1 0 輸出 4 原題url 這道題應該很快會讓我們想起使用動態規劃,從左上角...

221 最大正方形

在乙個由 0 和 1 組成的二維矩陣內,找到只包含 1 的最大正方形,並返回其面積。輸入 1 0 1 0 0 1 01 11 1 11 11 1 0 0 1 0輸出 4動態規劃。1 狀態方程dp i j 表示右下角下標為 i,j 時的最大正方形邊長。當遇到0時,dp i j 0,肯定不能構成正方形 ...