思路:在乙個由 『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,肯定不能構成正方形 ...