题目链接
最大正方形
题目描述
注意点
- matrix[i][j] 为 ‘0’ 或 ‘1’
解答思路
- 使用动态规划解决本题,任意一个格子作为正方形右下角时,其最大正方向面积取决于左侧,上方以及左上角三个格子对应的正方形边长最小值E1,改格子的最大边长为E1 + 1,也就是该公式:dp(i,j)=min(dp(i−1,j),dp(i−1,j−1),dp(i,j−1))+1
代码
class Solution {
public int maximalSquare(char[][] matrix) {
int res = 0;
int row = matrix.length;
int col = matrix[0].length;
int[][] dp = new int[row][col];
for (int i = 0; i < row; i++) {
if (matrix[i][0] == '0') {
continue;
}
dp[i][0] = 1;
res = 1;
}
for (int j = 0; j < col; j++) {
if (matrix[0][j] == '0') {
continue;
}
dp[0][j] = 1;
res = 1;
}
for (int i = 1; i < row; i++) {
for (int j = 1; j < col; j++) {
if (matrix[i][j] == '0') {
continue;
}
dp[i][j] = Math.min(Math.min(dp[i - 1][j], dp[i][j - 1]), dp[i - 1][j - 1]) + 1;
res = Math.max(res, dp[i][j] * dp[i][j]);
}
}
return res;
}
}
关键点
- 动态规划的思想
- 对于在左侧和上方的格子判断前面的格子边长时,可能会空指针,所以需要先将这些格子边长进行赋值(一定等于0或1)