Tuesday, August 25, 2015

[Matrix] Set Matrix Zeroes

1. Example
Given a mxn matrix, if an element is 0, set its entire row and column to 0.
Do it in-place?
[
[1,11,  1,1]
[2,  3,  4,0]
[5,  6, 19,8]
]
=>
[
[1,11 ,1 ,0]
[0,  0 ,0 ,0]
[5,  6, 19,0]
]

[
[1,11,  1,0]
[2,  3,  4,0]
[5,  6, 19,8]
]
=>
[
[0,0 , 0,0]
[2,  3,  4,0]
[5,  6, 19,0]
]
=>
[
[0,0 , 0,0]
[0,  0,  0,0]
[0,  0, 0,0]
]
=> WRONG, cannot set matrix zero in serial order
2.  Implementation
do a statistics to collect which row or index has zero and set the zeroes in a batch according to statistics table
Q1: how to form a such table ?
A1: keep two boolean array for row and column like row[m] and col[n]
Q1: how to form a such table without Extra space?
A1: use the the first row and the first column as row[m] = matrix[i][0]
and col[n] = matrix[0][i]
Q1: What about first column or first row has zero by itself?
A1: use two boolean flag to record



// Time :O(mxn) over the matrix, Space:O(1) two flag
public void setZeroes (int[][] matrix)
{
      // validate the input
      if (matrix == null || matrix.length == 0 || matrix[0].length == 0)
      {
         return;
      }

      


      boolean fstRowWithZero = false;
      boolean fstColWithZero = fasle;
      for (int i = 0 ; i < matrix. length;i++)
      {
           if (matrix[i][0] == 0)
           {
                fstColWithZero = true;
                // NOTE:
                break;
           }
      }
      for (int j = 0 ; j < matrix[0].length;j++)
      {
           if (matrix[0][j] == 0)
           {
                fstRowWithZero = true;
                // NOTE:
                break;
           }
      }



      // NOTE: start from second row and column
      //for ( int i = 0 ; i < matrix.length;i++)
      for ( int i = 1 ; i < matrix.length;i++)
      {
          //for (int j = 0 ; j < matrix[0].length ; j++)
          for (int j = 1 ; j < matrix[0].length ; j++)
          {
                if (matrix[i][j] == 0 )
                {
                     matrix[i][0] = 0;
                     matrix[0][j] = 0;
                }
          }
      }




      for (int i = 0 ; i < matrix.length;i++)
      { 
         for ( int j = 0 ; j < matrix[0].length ;j++)
         {
              if (   matrix[i][0] == 0 || matrix[i][j] == 0   )
              {
                   matrix[i][j] = 0;
              }
         }
      }
      if (fstRowWithZero == true)
      {
         for (int j = 0 ; j< matrix[0].length;j++)
         {
              matrix[0][j] = 0;
         }
      }
      if (fstColWithZero == true)
      { 
         for (int i = 0 ; i < matrix.length;i++)
         {
              matrix[i][0] = 0;
         }
      }

}
3. Similar Ones
Rotate Image
Search a 2D matrix
Spiral Matrix
Spiral Matrix II



No comments:

Post a Comment