当前位置:网站首页>LeetCode:221. 最大正方形

LeetCode:221. 最大正方形

2022-07-06 08:44:00 Bertil

在一个由 ‘0’ 和 ‘1’ 组成的二维矩阵内,找到只包含 ‘1’ 的最大正方形,并返回其面积。

示例 1:

在这里插入图片描述

输入:matrix = [["1","0","1","0","0"],["1","0","1","1","1"],["1","1","1","1","1"],["1","0","0","1","0"]]
输出:4

示例 2:
在这里插入图片描述

输入:matrix = [["0","1"],["1","0"]]
输出:1

示例 3:

输入:matrix = [["0"]]
输出:0

提示:

  • m == matrix.length
  • n == matrix[i].length
  • 1 <= m, n <= 300
  • matrix[i][j] 为 ‘0’ 或 ‘1’

解题思路

1.首先定义一个数组dp表示以[i][j]为正方形右下角的最大边长,定义一个变量max_len表示最大正方形的边长
2.状态转移方程:dp[i][j] = Math.min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]) + 1;(取三者的最小值是因为要构成正方形)
3.注意:若左边和上边的点为’1’,则dp[i][j] = 1

代码

/** * @param {character[][]} matrix * @return {number} */
var maximalSquare = function(matrix) {
    
    let max_len = 0;
    let dp = Array.from(Array(matrix.length), () => Array(matrix[0].length).fill(0));
    for (let i = 0; i < matrix.length; i++) {
    
        for (let j = 0; j < matrix[i].length; 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], dp[i][j - 1], dp[i - 1][j - 1]) + 1;
                }
                max_len = Math.max(max_len, dp[i][j]);
            }
        }
    }
    return max_len ** 2;
};
原网站

版权声明
本文为[Bertil]所创,转载请带上原文链接,感谢
https://blog.csdn.net/Bertil/article/details/125043209