題目
在一個由 0 和 1 組成的二維矩陣內,找到只包含 1 的最大正方形,並返回其面積。
示例:
輸入:
1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0
輸出: 4
解決方法
動態規劃:
思路:
定義dp[i][j]數組,dp[i][j]表示在matrix[i][j] 位置,能夠形成正方形的最大邊長。
對於每一個matrix[i][j] ,如果matrix[i][j] 等於0,那麼這個位置能形成的最大正方向就是0.
如果matrix[i][j] 等於1,那麼dp[i][j]的值,和其左上,左,上 三個位置的dp[i][j] 有關。
dp[i][j] = Min(dp[i-1][j]、dp[i][j-1]、dp[i-1][j-1]) + 1
該位置的值,等於左上,左,上 三個位置值裏面最小值加1,加1是因爲當前位置matrix[i][j] 等於1,那麼這個位置的最大邊長就是1,如果說其他三個位置都是1,那麼能夠形成最大的邊長就是1+1 =2 ,如果有一個位置是0,那麼就構不成正方向,就是0,這種情況下最大邊長就是1+0 = 1.
class Solution {
public int maximalSquare(char[][] matrix) {
if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
return 0;
}
int [][] dp = new int[matrix.length][matrix[0].length];
int maxSide = 0;
int cur = 0;
for (int i = 0; i < dp.length; i++) {
for (int j = 0; j < dp[0].length; j++) {
cur = matrix[i][j] == '0' ? 0 : 1;
if (cur == 1) {
if (i == 0 || j == 0) {
dp[i][j] = cur;
}else {
dp[i][j] = cur + Math.min(Math.min(dp[i -1][j],dp[i][j-1]),dp[i-1][j-1]);
}
maxSide = Math.max(maxSide,dp[i][j]);
}
}
}
// for (int[] ints : dp) {
// System.out.println(Arrays.toString(ints));
// }
return maxSide * maxSide;
}
}