【问题标题】:Finding largest square submatrix of ones in a given square matrix of 0's and 1's?在给定的 0 和 1 方阵中找到最大的方阵子矩阵?
【发布时间】:2010-12-09 05:11:34
【问题描述】:

以下是面试题:

编写一个函数,输出最大方子矩阵的大小,该子矩阵仅由 1 和 0 的方阵中的 1 组成。

示例 1:

0 1
0 0

输出:1

示例 2:

0 0 0
0 1 1
0 1 1

输出:2

示例 3:

1 1 1
1 1 1
1 1 1

输出 3

如果可能的话,我希望能有效地解决这个问题。

【问题讨论】:

标签: arrays algorithm


【解决方案1】:

使用Search,然后使用Dynamic Programming

【讨论】:

    【解决方案2】:

    实现的第一个想法: 从第 r=1 行开始搜索。

    在该行中找到最长的序列,并将这个长度分配给 x。

    尝试从第 r 行开始找到一个边=x 的方阵。如果成功,max=x。如果不是,则减小 x,如果 x>1,则重复此步骤。如果没有找到,max 可能是 0 或 1。

    增加r,然后重复。

    然后改进您的算法(如果剩余行数小于当前最大值,则停止,依此类推)。

    【讨论】:

      【解决方案3】:

      这是在 C# 中使用动态编程的 O(n) 实现。基本上,当您读取矩阵的每个单元格时,您正在构建另一个最大尺寸的矩阵(包括其自身)。

          public static int LargestSquareMatrixOfOne(int[,] original_mat)
          {
              int[,] AccumulatedMatrix = new int[original_mat.GetLength(0), original_mat.GetLength(1)];
              AccumulatedMatrix[0, 0] = original_mat[0, 0];
              int biggestSize = 1;
              for (int i = 0; i < original_mat.GetLength(0); i++)
              {
                  for (int j = 0; j < original_mat.GetLength(1); j++)
                  {
                      if (i > 0 && j > 0)
                      {
                          if (original_mat[i, j] == 1)
                          {
                              AccumulatedMatrix[i, j] = Math.Min(AccumulatedMatrix[i - 1, j - 1], (Math.Min(AccumulatedMatrix[i - 1, j], AccumulatedMatrix[i, j - 1]))) + 1;
                              if (AccumulatedMatrix[i, j] > biggestSize)
                              {
                                  biggestSize = AccumulatedMatrix[i, j];
                              }
                          }
                          else
                          {
                              AccumulatedMatrix[i, j] = 0;
                          }
                      }
                      else if ( (i > 0 && j == 0) || (j > 0 && i == 0))
                      {
                          if (original_mat[i, j] == 1) { AccumulatedMatrix[i, j] = 1; }
                          else { AccumulatedMatrix[i, j] = 0; }
                      }
                  }
              }
              return biggestSize;
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-17
        • 2019-09-27
        • 2016-04-20
        • 1970-01-01
        • 2012-04-10
        • 2021-10-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多