最大正方形(力扣热题HOT100 之 力扣221)java动态规划

简介: 最大正方形(力扣热题HOT100 之 力扣221)java动态规划

一、题目描述



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

示例 1:

7363eaf717994b0d992f16aba4d99bb8.png


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

输出:4


示例 2:

58ed77a7491b4c4ca9b28102ce218381.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'


二、思路讲解



将每个位置(i,j)作为正方形的右下角,使用dp[i][j]表示这个正方形只有1的最大面积。那么,


dp[i][j] = min{ dp[i-1][j], dp[i][j-1], dp[i-1][j-1] } + 1


然后找到dp数组中的最大值即可。


三、Java代码实现



class Solution {
    public int maximalSquare(char[][] matrix) {
        int m = matrix.length;
        int n = matrix[0].length;
        int [][]dp = new int[m][n];
        //将上边和左边的边界初始化
        for(int i=0; i<m; i++){
            if(matrix[i][0]=='1'){
                dp[i][0]=1;
            }
        }
        for(int i=0; i<n; i++){
            if(matrix[0][i]=='1'){
                dp[0][i]=1;
            }
        }
        //动态规划计算每个位置的值
        for(int i=1; i<m; i++){
            for(int j=1; j<n; j++){
                if(matrix[i][j]=='1'){
                    dp[i][j] = 
                    Math.min(Math.min(dp[i-1][j], dp[i][j-1]), dp[i-1][j-1]) + 1;
                }
            }
        }
        //找到dp中的最大值
        int big = 0;
        for(int i=0; i<m; i++){
            for(int j=0; j<n; j++){
                big = Math.max(big, dp[i][j]);
            }
        }
        return big*big;
    }
}



四、时空复杂度分析


     

时间复杂度:        O(MN)

空间复杂度:        O(MN)

相关文章
|
2月前
|
算法 Java
LeetCode(一)Java
LeetCode(一)Java
|
4月前
|
算法 Java
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
55 6
|
4月前
|
存储 算法 Java
LeetCode经典算法题:打家劫舍java详解
LeetCode经典算法题:打家劫舍java详解
72 2
|
4月前
|
人工智能 算法 Java
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
53 1
|
4月前
|
存储 算法 Java
LeetCode经典算法题:预测赢家+香槟塔java解法
LeetCode经典算法题:预测赢家+香槟塔java解法
64 1
|
4月前
|
存储 算法 Java
LeetCode经典算法题:二叉树遍历(递归遍历+迭代遍历+层序遍历)以及线索二叉树java详解
LeetCode经典算法题:二叉树遍历(递归遍历+迭代遍历+层序遍历)以及线索二叉树java详解
82 0
|
4月前
|
算法 Java
LeetCode初级算法题:环形链表+排列硬币+合并两个有序数组java解法
LeetCode初级算法题:环形链表+排列硬币+合并两个有序数组java解法
56 0
|
4月前
|
存储 算法 Java
LeetCode初级算法题:两数之和+斐波拉契数列多种java解法
LeetCode初级算法题:两数之和+斐波拉契数列多种java解法
44 0
|
4月前
|
算法 Java 索引
LeetCode初级算法题:寻找数组的中心索引+x的平方根+三个数的最大乘积+Leetcode 149:直线上最多的点数 Java详解
LeetCode初级算法题:寻找数组的中心索引+x的平方根+三个数的最大乘积+Leetcode 149:直线上最多的点数 Java详解
39 0
|
4月前
|
存储 算法 Java
LeetCode初级算法题:反转链表+统计N以内的素数+删除排序数组中的重复项Java详解
LeetCode初级算法题:反转链表+统计N以内的素数+删除排序数组中的重复项Java详解
47 0