算法-动态规划-13

力扣-真题-最大正方形

对于这道题, 题目要求找到 二维矩阵内 的最大正方形。

我们可以转化一下问题 ,

我们定义 fmn 是 以 valmn作为 右下角的 最大的正方形。

如果 val00 的值是 '1' 时, f00 为 1 ;

而且 对于 m = 0 或者 n = 0 的 fmn 当 其 valmn值为 '1' 时 都有

fmn = 1 ;

上面就是我们已知的条件了, 那么我们要怎么计算后续的fmn呢?

我们从 f11开始,

f11 如果是 0 , 那么 val11 一定等于 '0'

如果是 1 , 那么 val11 等于 '1' , val1\[0,val01,val00肯定有一个等于 '0', 此时 f10, f01, f00其中一个 为 '0'

如果是 2 , 那么 val1\[0,val01,val00,val11 的值都为'1'

f10 , f01, f00肯定都为1 。

也就是说fmn的值 跟 fm-1n, fmn-1, fm-1n-1有关。

首先 两种 情况一种情况是 valmn是 '0' 所以 fmn肯定为0 。

另一种情况, 则是根据 fm-1n, fmn-1, fm-1n-1进行计算。

针对三个值, 进行分析。

如果存在一个是 0 , 那么 fmn = 1

如果都大于 0,存在一个是'1' , fmn 好像只有可能是 2 ,因为都大于0 ,所以至少是1 , 那么 fmn等于2 就满足条件了。

那么fmn可能等于3吗? 等于3的条件 好像周边三个值f\[\]\[\]都得至少为2 , 因为存在一个等于1

那么往下推, fmn的值, 跟 fm-1n, fmn-1, fm-1n-1中的最小值, 假如说是 x , 那么其值就是x +1 。

java 复制代码
public int maximalSquare(char[][] matrix) {
        int max = 0;
        int[][] f = new int[matrix.length][matrix[0].length];
        for (int i = 0; i < matrix.length; i++) {
            if (matrix[i][0] == '1') {
                f[i][0] = 1;
                max = 1;
            }
        }

        for (int i = 0; i < matrix[0].length; i++) {
            if (matrix[0][i] == '1') {
                f[0][i] = 1;
                max = 1;
            }
        }


        for (int i = 1; i < matrix.length; i++) {
            for (int j = 1; j < matrix[0].length; j++) {
                if (matrix[i][j] == '1') {
                    int min = Math.min(f[i - 1][j], f[i][j - 1]);
                    min = Math.min(min, f[i - 1][j - 1]);
                    f[i][j] = min + 1;
                    max = Math.max(max, f[i][j]);
                } else {
                    f[i][j] = 0;
                }
            }
        }

        return max * max;
    }

复杂度

时间复杂度分析

初始化第一列:遍历 matrix 的行数,执行 m 次操作

初始化第一行:遍历 matrix 的列数,执行 n 次操作

填充DP表:嵌套循环遍历从 (1,1) 到 (m-1,n-1) 的每个位置,执行 (m-1)*(n-1) 次操作

总的操作次数约为 m + n + (m-1)(n-1) = O(mn),因此时间复杂度确实是 O(mn)。

空间复杂度分析

主要的空间消耗来自创建的二维数组 f:

f 数组大小为 m × n,存储了每个位置的最大正方形边长

其他变量如 max、min 等都是常量空间

所以空间复杂度也是 O(mn)。

相关推荐
小羊在睡觉1 小时前
力扣84. 柱状图中最大的矩形
后端·算法·leetcode·golang·go
3DVisionary1 小时前
蓝光三维扫描:医疗制造的精度焦虑怎么解
人工智能·算法·制造·蓝光三维扫描·医疗制造·三维检测·义齿检测
好评笔记1 小时前
机器学习面试八股——常用损失函数
人工智能·深度学习·算法·机器学习·校招
weixin_468466851 小时前
全局与局部注意力机制新手实战指南
人工智能·python·深度学习·算法·自然语言处理·transformer·注意力机制
_日拱一卒2 小时前
LeetCode:994腐烂的橘子
java·数据结构·算法·leetcode·深度优先
珂朵莉MM2 小时前
第七届全球校园人工智能算法精英大赛-算法巅峰赛产业命题赛第3赛季优化题--束搜索
人工智能·算法
Omics Pro3 小时前
首个!外源天然产物综合性代谢图谱
数据库·人工智能·算法·机器学习·r语言
voidmort3 小时前
3. 微调(Fine-tuning)与强化学习(RL)的核心思想
python·深度学习·算法
人道领域4 小时前
【LeetCode刷题日记】669.修剪二叉搜索树
开发语言·python·算法
QiLinkOS4 小时前
【从实验室到商业战场:发明专利如何重塑科技与企业的共生生态】
大数据·c语言·数据结构·c++·人工智能·单片机·算法