这一题和72. 编辑距离还有64. 最小路径和的状态转移方程都差不多
这里的思路都可以多思考下
这里的dp[i][j]表示以i,j为右下角的正方形的最大边长
matrix[i][j] === "1"的情况下
- 边界上面的
dp[i][j]都是一个小正方形,也就是边长为1 - 除开边界,那么就是
左上、左边、上边的三块取最小值,这里保证相邻的能构成正方形即可,如果其中有一个为0,那么显然易见,这4块是构不成正方形的,如果都为1,那么就可以构成2*2了
var maximalSquare = function (matrix) {
let row = matrix.length;
let col = matrix[0].length;
let dp = Array.from({ length: row }, () => Array(col).fill(0));
let maxLen = 0;
for (let i = 0; i < row; ++i) {
for (let j = 0; j < col; ++j) {
if (matrix[i][j] === "1") {
if (i === 0 || j === 0) {
dp[i][j] = 1;
} else {
dp[i][j] =
Math.min(dp[i - 1][j - 1], dp[i - 1][j], dp[i][j - 1]) +
1;
}
maxLen = Math.max(maxLen, dp[i][j]);
}
}
}
return maxLen ** 2;
};