這道題主要是利用動態規劃,注意好邊界條件,就可以解決。
在乙個由 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:
這道題應該很快會讓我們想起使用動態規劃,從左上角往右下角開始找。
假設我們用乙個二維陣列dp
,記錄每乙個位置所能構成的最大正方形的邊長(從左上角開始算)。位置(i, j)
是 1,則其可能構成的正方形的邊長是min(dp(i - 1, j - 1), dp(i - 1, j), dp(i, j - 1)) + 1
。看到這個,相信你也會理解了,每乙個位置所能構成的最大邊長的條件,其實是要求包圍著它的左上角三個位置都是 1 才可以。
一直遞推回到最初點,也就意味著,第一行和第一列需要單獨判斷。
之前應該也有做過類似空間複雜度上的優化,我們真的需要乙個真正的二維資料dp
來記錄中間結果嗎?其實我們發現,當乙個位置用過之後,這個位置本身的數字已經不再重要,關鍵是該位置所能構成的最大正方形的邊長,也就是我們記錄的中間結果。因此可以直接更新原陣列上的數字。
還有就是需要考慮一些特殊情況,比如只有一行或者一列的時候,我們應該如何做。
接下來讓我們看看**:
class solution
// 寬
int width = matrix[0].length;
// 檢查第一行和第一列,是否有'1'
int result = checkfirstrowandcol(matrix, height, width);
// 只有一行或一列,或者只有乙個
if (height == 1 || width == 1)
// result現在做為記錄最大邊的長度
// 中間結果
int temp;
for (int i = 1; i < height; i++)
// 求出matrix[i - 1][j - 1]、matrix[i - 1][j]、matrix[i][j - 1]中的最小值
temp = matrix[i - 1][j] < matrix[i][j - 1] ? matrix[i - 1][j] : matrix[i][j - 1];
temp = temp < matrix[i - 1][j - 1] ? temp : matrix[i - 1][j - 1];
// 更新當前節點的值
matrix[i][j] = (char) (temp + 1);
temp = temp + 1 - '0';
if (result < temp) }}
return result * result;
}private int checkfirstrowandcol(char matrix, int height, int width)
}// 檢查第一行
for (int i = 0; i < width; i++)
}return 0;}}
提交ok,執行用時:5 ms
,記憶體消耗:41.1 mb
。
上面的這個**,我並不是一次性就直接寫出來的,也是在不斷的提交中,發現有一些特殊情況沒有考慮,幸運的是力扣會每次提交完之後會告訴我不滿足時的輸入的是什麼樣的,但這也會讓我經常考慮不足,還需要努力。
以上就是這道題目我的解答過程了,不知道大家是否理解了。這道題目利用動態規劃其實就差不多了,但重點還是在於特殊情況的判斷,需要注意。
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 的最大正方形,並返回其面積。輸入 matrix 1 0 1 0 0 1 0 1 1 1 1 1 1 1 1 1 0 0 1 0 輸出 4每當看到這種正方形或者矩形的題目,都會形成一種本能的反應,就是找到兩個點,即左上和右下頂點,因為固定這...
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,肯定不能構成正方形 ...