给定m和n矩阵0和1,如果元素为0,则将其整个行和列设置为0

时间:2016-09-03 06:10:50

标签: algorithm matrix data-structures

给定m和n矩阵0和1,如果元素为0,则将其整个行和列设置为0

如何在没有任何额外空间复杂性的情况下解决此问题

3 个答案:

答案 0 :(得分:1)

使用第一行和第一列作为标记列表,分别标记相应的列和行。总的来说,m+n-1矩阵可以使用mxn个标记,只需要一个 额外的 标记来标记{{1行或1st列(它由程序员选择,虽然没有区别)。

1st

然后遍历矩阵,如果列或行中的任何元素为0,则标记标记。

然后,一旦完成遍历,使用这些标志来决定哪个列或行将填充所有0。

答案 1 :(得分:0)

一种天真的方法是简单地迭代整个矩阵:

for i in 1 to number of rows
 for j in 1 to number of columns
   if n(i,j) == 0:
     for all n(i, 1 to number of columns): set to 0
     for all n(1 to number of rows, j): set to 0

除了两个循环计数器之外,这不需要任何额外的空间。当然,关于表现是O(可怕),但你没有问过这个问题。

为了提高性能,您可以收集包含1的所有行和列索引;并且只将它们归零一次;但这意味着:为这些索引分配空间。

答案 2 :(得分:0)

  • 使用布尔变量(而不是布尔数组)减少用于O(1)的空间
  • 检查第一行和第一列是否为零。如果是,请设置相应的布尔变量:rowZerocolZero
  • 遍历其余行和列,并在适用的情况下将其标记为零
  • 如果第一行/列不为零,则使用这些方法将其标记为零
        public static void ZeroMatrixResultBitVector(int[][] matrix)
        {
            bool rowZero = false;
            bool colZero = false;

            // check if first row has zero
            for (int i = 0; i < matrix.Length; i++)
            {
                if (matrix[i][0] == 0)
                {
                    colZero = true;
                    break;
                }
            }

            // check if first column is zero
            for (int j = 0; j < matrix[0].Length; j++)
            {
                if (matrix[0][j] == 0)
                {
                    rowZero = true;
                    break;
                }
            }

            //if the above hasn't been true then we will update the first column/row later
            for (int i = 1; i < matrix.Length; i++)
            {
                for (int j = 1; j < matrix[0].Length; j++)
                {
                    if (matrix[i][j] == 0)
                    {
                        matrix[i][0] = 0;
                        matrix[0][j] = 0;
                    }
                }
            }

            //nullify all row related records
            for (int i = 1; i < matrix.Length; i++)
            {
                if (matrix[i][0] == 0)
                {
                    nullifyRow(matrix, i);
                }
            }

            //nullify all column related records
            for (int j = 1; j < matrix[0].Length; j++)
            {
                if (matrix[0][j] == 0)
                {
                    nullifyColumn(matrix, j);
                }
            }

            if (rowZero)
            {
                nullifyRow(matrix, 0);
            }

            if (colZero)
            {
                nullifyColumn(matrix, 0);
            }

        }

使行无效的功能:

        private static void nullifyRow(int[][] matrix, int row)
        {
            for (int j = 0; j < matrix[0].Length; j++)
            {
                matrix[row][j] = 0;
            }
        }

使列无效的功能:

        private static void nullifyColumn(int[][] matrix, int column)
        {
            for (int i = 0; i < matrix[0].Length; i++)
            {
                matrix[i][column] = 0;
            }
        }