Maximal Square 面积最大的正方形

给一个2维的矩阵,里面的值为‘0’,‘1’, 找到都是1的最大的正方形的面积。

这是一道可以用动态规划来解决的问题。

1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0

比如这个矩阵的最大的正方形的边长为2,返回面积4.

我们将某个坐标 (i,  j )下能够构成的正方形的边长记为cache[ i ] [ j ]。

我们先来看 (0,0),  (0,1),  (0,2), (0,3) 这些坐标下,值为1,那么能够构成边长为1的;值为0的,不能构成正方形。

同样的,对于(1,0), (2,0), (3,0)这些坐标下,能够构成1, 1, 1的正方形。

所以,我们得到一个base情况下的结果,即第一行,第一列的坐标下,cache[ i ] [ j ] = 对应 matrix 中的值。

再看中间点的情况。

看(1,1)坐标下,它的值是0,那么显然不能构成正方形。

所以,我们来看坐标下的值为1的,比如,(2,1)坐标下的。

截取一部分来看:

[1 0]

[1 0]

[1 1]

它的上面为0,它只能自己构成正方形,边长 = 1。

于是,可以得到一个更为general的推论

如果某个坐标的值为1,那么cache[ i ] [ j ] = min ( cache[ i ] [ j  - 1] ,cache[ i - 1 ] [ j ] ,cache[ i - 1 ] [ j  - 1 ] )+ 1

最终,我们将上面的思考整理一下,可以得到:

  1. 对于第一行 (j = 0),第一列 (i = 0),这些边缘的,cache[ i ] [ j ] = matrix[ i ] [ j ] 

  2. i  > 0 && j > 0 :

if matrix[ i ][ j ] = 0, cache[ i ] [ j ] = 0 ; 

if matrix[ i ][ j ] = 1, cache[ i ] [ j ] = min ( cache[ i ] [ j  - 1] ,cache[ i - 1 ] [ j ] ,cache[ i - 1 ] [ j  - 1 ] )+ 1 .


复杂度:

时间复杂度 :O(m * n)

空间复杂度:O (m * n)


代码:

    public int maximalSquare(char[][] matrix) {
        int m = matrix.length;
        if (m == 0) {
            return 0;
        }
        int n = matrix[0].length;
        int[][] cache = new int[m][n];
        int maxLength = 0;
        //base cases
        for (int i = 0; i < m; i++) {
            cache[i][0] = matrix[i][0] - '0';
            maxLength = Math.max(maxLength, cache[i][0]);
        }
        for (int j = 0; j < n; j++) {
            cache[0][j] = matrix[0][j] - '0';
            maxLength = Math.max(maxLength, cache[0][j]);
        }
        //general cases
        for (int i = 1; i < m; i++) {
            for (int j = 1; j < n; j++) {
                if (matrix[i][j] == '0') {
                    cache[i][j] = 0;
                } else {
                    cache[i][j] = Math.min(Math.min(cache[i][j - 1], cache[i - 1][j]), cache[i - 1][j - 1]) + 1;
                    maxLength = Math.max(maxLength, cache[i][j]);
                }
            }
        }
        return maxLength * maxLength;
    }


对空间的优化:

其实不需要 m * n 大小的。

只有 n 的空间就可以了,用2个长为 n 的数组。

存储前一行pre的信息和当前行cur的信息。(一行结束后,pre = cur, cur = 0 )



参考:

https://leetcode.com/discuss/38489/easy-solution-with-detailed-explanations-8ms-time-and-space

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Maximal Information Coefficient(最大化信息系数)是一种用于计算变量之间相关性的方法。该方法可以在自然的、无监督的方式下学习变量之间的关系,而无需预设模型或参数。 MATLAB是一种用于科学计算和数据分析的工具。MATLAB提供了一系列内置的函数和工具箱来计算MIC(最大化信息系数)。要计算MIC,可以使用MATLAB中的mic函数。mic函数接受输入向量或矩阵作为参数,并返回两个变量之间的MIC值及其p值。 使用matlab进行MCI计算非常方便。只需从mic函数中提供需要计算的两个变量的数据,并选择任何其他可选参数(例如,MIC类型、置信水平等)。输出将包括MIC值及其p值。 综上所述,MATLAB提供了一个强大而灵活的工具,可以计算变量之间的最大信息系数。这是一种实用的方法,可用于许多领域,例如数据挖掘、模式识别、基因表达分析等。 ### 回答2: 最大互信息系数,即maximal information coefficient (MIC)是一种衡量两个变量之间关系的度量,它能够检测到线性和非线性的相关性。使用MATLAB可以方便地计算MIC值。 MATLAB中的MIC计算方法分为两步:第一步是利用单变量信息理论工具,计算两个变量中每一个变量和其它变量之间的互信息量,得到一个图像矩阵;第二步是根据wasserstein距离选择最大的单调关系,以便最终得到一个MIC值。 MATLAB中mic函数可用于计算MIC值。该函数需要输入两个变量的数组x和y,然后返回其MIC值。 使用MIC检测变量之间的关系有许多应用,比如在复杂数据集中发现变量之间的相关性以及在生物学中研究基因表达和疾病之间的关系等。由于其灵活性和易于操作性,MATLAB中的MIC计算工具在分析大量数据时具有重要的作用。 ### 回答3: 最大信息系数(Maximal Information Coefficient,MIC)是一种用于量化两个变量之间关联度的方法,它能够识别出各种类型的关联关系包括非线性关系。Maximal Information Coefficient matlab是一个常用工具,用于计算最大信息系数,它可以帮助我们分析数据集,探测出它们之间的关联性。在matlab中安装了MIC工具箱后,我们可以使用mic函数来计算两个变量的最大信息系数,并以此评估它们之间的关联性。 使用mic函数进行最大信息系数分析时,需要输入两个变量的数值矩阵,返回的结果包括最大信息系数的值和P值。最大信息系数值越高,说明两个变量之间的关联程度越强。P值则表示其显著性程度,P值越小,说明结果越可靠。我们还可以通过设置变量之间的最小重合部分来完善结果。 最大信息系数是一种数据挖掘和机器学习方法,它可应用于许多领域,包括生物学,经济学和社会学等。在生物学中,最大信息系数可用于分析基因表达和生物多样性数据,探讨不同物种间的关联性。在经济学中,它可用于分析股票价格的波动和其他金融数据的关联,以便制定投资策略。最大信息系数的应用广泛,可帮助我们更好地理解变量间的关系,并从中提取有价值的信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值