題目
在一個二維01矩陣中找到全為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]:最大正方形的邊長 狀態轉移方程: if(matrix[i][j] == 1) { dp[i][j] = Math.min(dp[i-1][j-1], Math.min(dp[i-1][j], dp[i][j-1])) + 1; } else dp[i][j] = 0;
程式碼
public class Solution {
/**
* @param matrix: a matrix of 0 and 1
* @return: an integer
*/
public int maxSquare(int[][] matrix) {
int ans = 0;
//得到行數
int n = matrix.length;
int m;
//得到列數
if(n > 0)
m = matrix[0].length;
else
return ans;
//dp[i][j] 最大正方形的邊長
int[][] dp = new int [n][m];
//初始化初始條件
for(int i=0;i<n;i++)
if(matrix[i][0] == 1) {
dp[i][0] = matrix[i][0];
ans = 1;
}
for(int i=0;i<m;i++)
if(matrix[0][i] == 1) {
dp[0][i] = matrix[0][i];
ans = 1;
}
//狀態轉移方程,用ans儲存最大邊長
for(int i=1;i<n;i++) {
for(int j=1;j<m;j++) {
if(matrix[i][j] == 1) {
dp[i][j] = Math.min(dp[i-1][j-1], Math.min(dp[i-1][j], dp[i][j-1])) + 1;
}
else
dp[i][j] = 0;
ans = Math.max(dp[i][j], ans);
}
}
return ans*ans;
}
}
複製程式碼