Q:給定一個包含0和1的二維二進制矩陣,找出只包含1的最大正方形並返回其面積。
Example:
Input:
1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0
Output: 4
A:引用:https://blog.csdn.net/fly_fly_zhang/article/details/90637370
我們初始化一個二維矩陣dp, dp [ i ] [ j ] 表示以它為右下角的最大正方形邊長。遍歷原矩陣,每找到一個1,就求以它為右下角的最大正方形邊長。
正方形的判斷是一個從小到大的過程:
先看一個節點是否為1;
再看2/2范圍是否滿足條件。
依次,直到n/n范圍是否滿足條件。
由此,這是后一個結果是否成立基於前一個結果的成立 ,因此使用dp處理。
dp[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] 確定右上角位置。
根據這三個正方形邊長的最小值就可以確定對應位置。

public int maximalSquare(char[][] matrix) {
if(matrix==null||matrix.length==0||matrix[0]==null||matrix[0].length==0)
return 0;
int row=matrix.length;
int col=matrix[0].length;
int max=0;
//因為矩陣最上面的點是以它自己為一個矩陣的,但是為了計算方便
//我們假設它有
int [][] dp=new int[row+1][col+1];
for(int i=1;i<=row;i++){
for(int j=1;j<=col;j++){
if(matrix[i-1][j-1]=='1'){
//得到最短的正方形邊長
dp[i][j]=Math.min(dp[i-1][j],Math.min(dp[i-1][j-1],dp[i][j-1]))+1;
max=Math.max(dp[i][j],max);
}
}
}
return max*max;
}
