在一个由 '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
思路与代码
动态规划
dp[i][j]
表示以 (i,j)
(为右下角,且只包含 '1'
的正方形的边长最大值。
核心是dp(i,j)=min(dp(i−1,j),dp(i−1,j−1),dp(i,j−1))+1
证明过程来自LeetCode
class Solution {
public int maximalSquare(char[][] matrix) {
int row = matrix.length;
if (row == 0) return 0;
int col = matrix[0].length;
int[][] dp = new int[row][col];
int maxSide = 0;
for (int i = 0; i < row; i++) {
for (int j = 0 ; j < col; j++) {
if (matrix[i][j] == '0') {
dp[i][j] = 0;
}
else {
if (i == 0 || j == 0) dp[i][j] = 1;
else dp[i][j] = Math.min(Math.min(dp[i-1][j], dp[i][j-1]), dp[i-1][j-1]) + 1;
}
maxSide = Math.max(maxSide, dp[i][j]);
}
}
return maxSide * maxSide;
}
}