最大正方形(力扣热题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月前
|
索引 容器
两数之和(每天刷力扣hot100系列)
本题要求在数组中找出两数之和等于目标值的下标。解法一为暴力枚举,时间复杂度O(N²),空间复杂度O(1);解法二利用哈希表,将查找时间降为O(1),总时间复杂度O(N),空间复杂度O(N),实现以空间换时间的优化。
|
2月前
|
存储 C++ 索引
最长连续序列(每天刷力扣hot100系列)
本题使用哈希表法求最长连续序列。利用unordered_set存储去重元素,遍历集合时仅当num-1不存在时才作为起点向后扩展,统计连续长度,时间复杂度O(n),空间复杂度O(n)。相比unordered_map更高效,因无需存储值。
|
8月前
|
机器学习/深度学习 算法 Go
【LeetCode 热题100】139:单词拆分(动态规划全解析+细节陷阱)(Go语言版)
本题是 LeetCode 热题 139:单词拆分(Word Break),需判断字符串 `s` 是否能由字典 `wordDict` 中的单词拼接而成。通过动态规划(DP)或记忆化搜索解决。DP 中定义布尔数组 `dp[i]` 表示前 `i` 个字符是否可拆分,状态转移方程为:若存在 `j` 使 `dp[j]=true` 且 `s[j:i]` 在字典中,则 `dp[i]=true`。初始条件 `dp[0]=true`。代码实现中用哈希集合优化查找效率。记忆化搜索则从起始位置递归尝试所有切割点。两种方法各有利弊,DP 更适合面试场景。思考扩展包括输出所有拆分方式及使用 Trie 优化大字典查找。
254 6
|
11月前
|
算法 Java C++
【潜意识Java】蓝桥杯算法有关的动态规划求解背包问题
本文介绍了经典的0/1背包问题及其动态规划解法。
344 5
|
算法 Java
LeetCode(一)Java
LeetCode(一)Java
159 0
|
算法 Java
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
178 6
|
存储 算法 Java
LeetCode经典算法题:打家劫舍java详解
LeetCode经典算法题:打家劫舍java详解
196 2
|
人工智能 算法 Java
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
186 1
|
存储 算法 Java
LeetCode经典算法题:预测赢家+香槟塔java解法
LeetCode经典算法题:预测赢家+香槟塔java解法
198 1
|
缓存
力扣每日一题 6/14 动态规划+数组
力扣每日一题 6/14 动态规划+数组
119 1