Skip to content

力扣链接: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;
}