LeetCode 动态规划之最大正方形

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第6天,点击查看活动详情

题目

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

示例 1:

image.png

输入:matrix = [
["1","0","1","0","0"],
["1","0","1","1","1"],
["1","1","1","1","1"],
["1","0","0","1","0"]
]
输出:4
复制代码

示例 2:

image.png

输入: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. 本题是以典型的动态规划问题;
  2. dp[i][j]表示以第i行第j列为右下角所能构成的最大正方形边长, 则递推式为:
dp[i][j] = 1 + min(dp[i-1][j-1], dp[i-1][j], dp[i][j-1]);
复制代码

然后通过 max * max 获取矩形区域最大值。
3. 解题代码如下所示:
复杂度
时间复杂度: O(M * N)
空间复杂度: O(M * N)

解题代码

题解代码如下(代码中有详细的注释说明):

class Solution {
    public int maximalSquare(char[][] matrix) {
        /**
        dp[i][j]表示以第i行第j列为右下角所能构成的最大正方形边长, 则递推式为: 
        dp[i][j] = 1 + min(dp[i-1][j-1], dp[i-1][j], dp[i][j-1]);
        **/
        int m = matrix.length;
        if(m < 1) return 0;
        int n = matrix[0].length;
        int max = 0;
        int[][] dp = new int[m+1][n+1];
        
        for(int i = 1; i <= m; ++i) {
            for(int j = 1; j <= n; ++j) {
                if(matrix[i-1][j-1] == '1') {
                    dp[i][j] = 1 + Math.min(dp[i-1][j-1], Math.min(dp[i-1][j], dp[i][j-1]));
                    max = Math.max(max, dp[i][j]); 
                }
            }
        }
        
        return max*max;
    }
}
复制代码

提交后反馈结果(由于该题目没有进行优化,性能一般):

image.png

参考信息

猜你喜欢

转载自juejin.im/post/7083449421286866981