【Leetcode】221. 最大正方形

36 阅读1分钟

leetcode221.png

这一题和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;
};