文章目录
221. 最大正方形
在一个由 ‘0’ 和 ‘1’ 组成的二维矩阵内,找到只包含 ‘1’ 的最大正方形,并返回其面积。
示例 1:
输入:matrix = [[“1”,“0”,“1”,“0”,“0”],[“1”,“0”,“1”,“1”,“1”],[“1”,“1”,“1”,“1”,“1”],[“1”,“0”,“0”,“1”,“0”]]
输出:4
示例 2:
输入:matrix = [[“0”,“1”],[“1”,“0”]]
输出:1
示例 3:
输入:matrix = [[“0”]]
输出:0
提示:
m == matrix.length
n == matrix[i].length
1 <= m, n <= 300
matrix[i][j] 为 ‘0’ 或 ‘1’
解题
方法:动态规划
dp[i][j] 表示以(i,j)为右下角的,且只包含 1 的正方形的边长最大值。
- 如果matrix[i][j] = 0, 则dp[i][j]= 0 不符合题意
- 如果matrix[i][j] = 1,找其上方,左方,左上方的dp,前提是这三个都是1,如果有一个为0,那dp[i][j] = 1
即dp[i][j] = min(dp[i-1][j], dp[i][j-1], dp[i-1][j-1]) + 1.
找到最大边长,答案就是边长*边长
// 时间O(m*n)空间O(m*n)
class Solution {
public int maximalSquare(char[][] matrix) {
if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
return 0;
}
int maxSide = 0;
int row = matrix.length;
int col = matrix[0].length;
// 这里是遍历整个二维数组,找到符合题意的最大边长,所以范围和数组的长度一样即可
int[][] dp = new int[row][col];
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
// 此位置的值为1,才会填充dp,其他默认为0就好
if (matrix[i][j] == '1') {
// 边界特殊值
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;
}
}