力扣链接:221.最大正方形
难度:⭐⭐
解题关键词:动态规划
解题思路:计算每一个节点以该节点为正方形的右下角,可以形成的最大的边长是多少。如果当前节点为 1,转移方程:dp[i][j] = Math.min(dp[i - 1][j], dp[i - 1][j - 1], dp[i][j - 1]) + 1; 取三个方向中最小的一个,然后加 1
typescript
function maximalSquare(matrix: string[][]): number {
if (!matrix.length || !matrix[0].length) return 0;
const m = matrix[0].length;
const n = matrix.length;
const dp = new Array(n).fill(0).map(() => new Array(m).fill(0));
let result = 0;
for (let i = 0; i < n; i++) {
for (let j = 0; j < m; j++) {
if (matrix[i][j] === "1") {
// 如果是最上面或者最左边,直接等于 1
if (i === 0 || j === 0) {
dp[i][j] = 1;
} else {
// 取三个方向中最小的一个,然后加1
dp[i][j] = Math.min(dp[i - 1][j], dp[i - 1][j - 1], dp[i][j - 1]) + 1;
}
// 取最大边长
result = Math.max(result, dp[i][j]);
}
}
}
// 算出面积
return result * result;
}