【问题标题】:Given an m x n matrix of 0s and 1s, if an element is 0, set its entire row and column to 0给定一个由 0 和 1 组成的 m x n 矩阵,如果一个元素为 0,则将其整行整列设置为 0
【发布时间】:2016-09-03 06:10:50
【问题描述】:

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

我们怎样才能在没有额外空间复杂度的情况下解决这个问题

【问题讨论】:

    标签: algorithm matrix data-structures


    【解决方案1】:

    使用第一行和第一列作为标志列表,分别标记相应的列和行。所以总的来说,mxn 矩阵将有 m+n-1 标志可供您使用,只需要一个 extra 标志来标记1st 行或@987654324 @ 列(由程序员选择,但没有区别)。

    [C0/R0] C1 C2 ... Cn-1
      R1      
      R2
       .
      Rm-1
    
    Take one extra flag for [R0/C0].
    

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

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

    【讨论】:

    • 我们不会丢失第一行/列中0和1的信息吗?
    • @AkashdeepSaluja 最终修改后的矩阵无论如何都需要将第一列和第一行中的每个元素都归零..
    【解决方案2】:

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

    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 的行和列索引;并将它们归零一次;但这意味着:为这些索引分配空间。

    【讨论】:

      【解决方案3】:
      • 使用布尔变量(而不是布尔数组)将使用的空间减少到 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;
                  }
              }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-25
        • 1970-01-01
        • 2022-08-05
        • 2010-10-12
        • 2021-12-19
        • 1970-01-01
        • 1970-01-01
        • 2021-10-12
        相关资源
        最近更新 更多