找到0和1的给定方阵中最大的方形子矩阵?

时间:2010-12-09 05:11:34

标签: arrays algorithm

以下是面试问题:

  

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

示例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

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

3 个答案:

答案 0 :(得分:2)

使用Search,然后Dynamic Programming

答案 1 :(得分:0)

首先实施的想法: 在r = 1行开始搜索。

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

尝试找到一个方形矩阵,其中side = x从行r开始。如果成功,则max = x。如果不是,请减小x并重复此步骤,如果x> 1。如果找不到任何内容,则max可以是0或1。

增加r,然后重复。

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

答案 2 :(得分:0)

这是使用动态编程在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;
    }