全为 1 的最大尺寸平方子矩阵 [重复]

Posted

技术标签:

【中文标题】全为 1 的最大尺寸平方子矩阵 [重复]【英文标题】:Maximum size square sub-matrix with all 1s [duplicate] 【发布时间】:2013-07-21 07:19:29 【问题描述】:

给定一个二进制矩阵,我找到了所有1s 的最大平方子矩阵。

例如,考虑下面的二进制矩阵:

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

所有设置位的最大平方子矩阵是

1  1  1
1  1  1
1  1  1

我在网上搜索了解决方案,并找到了构造辅助矩阵的关系:

 If M[i][j] is 1 then
            S[i][j] = min(S[i][j-1], S[i-1][j], S[i-1][j-1]) + 1
         Else /*If M[i][j] is 0*/
            S[i][j] = 0
    M[][] 是原始矩阵,s[][] 是辅助矩阵? 这种关系意味着什么? 它有什么帮助。

【问题讨论】:

这是两年多前在此博客上提出的问题的副本:tech-queries.blogspot.com/search/label/Dynamic%20programming。 【参考方案1】:

您可以在线性时间内做到这一点。

声明:我可以在线性时间内构建一个数据结构,让我可以在恒定时间内检查任意矩形是否全为 1。

证明:部分和;取S[i][j](i, j) 上方和左侧1 的总数。在(a,b)(c,d) 之间的矩形中,如果(a,b)(c,d) 的上方和左侧,则为S[c][d] + S[a][b] - S[a][d] - S[b][c]

现在是对数组的简单扫描:

size = 1;
For i = 0 to m-size 
  For j = 0 to n-size 
    If S[i+size][j+size] - S[i][j+size] - S[i+size][j] + S[i][j] == size*size 
      size++; j--; continue;
    
  

最后,size 比最大的 1-full square 大一。

【讨论】:

时间是如何线性的?不会是 O(n^2) 吗? @WasimThabraze:“线性”表示“输入大小呈线性”。对于 n*n 网格,输入有 n^2 个元素。【参考方案2】:

这是一个经典的动态规划问题。而且你还没有提到整个算法如下:

要构造辅助数组,我们必须执行以下操作:

    首先将第一行第一列从M[][]复制到S[][]

    对于您提到的其余条目,请执行以下操作:

     If M[i][j] is 1 then
        S[i][j] = min(S[i][j-1], S[i-1][j], S[i-1][j-1]) + 1
     Else /*If M[i][j] is 0*/
        S[i][j] = 0
    

    在S[][]中找到最大的入口,并用它来构造最大尺寸的方形子矩阵

这种关系意味着什么?

要找到最大平方,我们需要找到1s在不同方向上的最小延伸,并在其上加1,形成当前情况下平方结束的长度。

所以对于您的情况 s[][] 将是:

   0  1  1  0  1
   1  1  0  1  0
   0  1  1  1  0
   1  1  2  2  0
   1  2  2  3  1
   0  0  0  0  0

如果我们只取其中的最小值,即S[i][j-1], S[i-1][j],它会处理左上角方向。但是,我们还需要确保透视正方形的左上角有 1。 S[i-1][j-1],根据定义,在位置 i-1,j-1 处包含一个最大正方形,其左上角设置了我们可以向上和向左的上限。所以,我们也需要考虑这一点。

希望这会有所帮助!

【讨论】:

...为了找到 M 的最大全 1 平方子矩阵,在 S 中找到最大条目,例如S[i][j]。此条目表示大小为 S[i][j] 的 M 的最大全 1 方子矩阵的右下角。【参考方案3】:

您可以构建一个额外的递归函数,该函数将当前行和列作为参数,并从中查找任意大小的正方形。

从您的其他函数中,在额外函数返回一个值后,您必须进行 2 次调用: 一个来自 (row,col+1),另一个来自 (row+1,col)。

这是回溯用法,我们检查所有选项。

【讨论】:

以上是关于全为 1 的最大尺寸平方子矩阵 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

将图像缩放到 flexbox 中的最大尺寸 [重复]

方案设计

最大尺寸的方形子矩阵

C#中[,]和[][]的区别[重复]

LeetCode 1277. 统计全为 1 的正方形子矩阵

在给定二进制 MxN 矩阵和切换列的能力的情况下最大化行相同性?