CC150 1.1

1.7 Write an algorithm such that if an element in an MxN matrix is 0, its entire row and column is set to 0.


Copy to a new matrix. Or each element need to store a boolean flag indicating whether this element should be 0 or not.

// Copy
int[][] clear(int[][] input)
{
  if (input == null)
    return null;
  
  int[][] toReturn = initialize(-1);  
  
  for (int i = 0 ; i < input.length ; i ++)
  {
    for (int j = 0 ; j < input[0].length ; j ++)
    {
      if (input[i][j] != 0)
      {
        if (toReturn[i][j] != -1)
          toRetur[i][j] = input[i][j];
      }
      else
      {
        // Clear row
        for (int m = 0 ; m < input.length ; m ++)
          toReturn[m][j] = 0;
        // Clear column
        for (int m = 0 ; m < input[0].length; m ++)
          toReturn[i][m] = 0;
      }
    }
  }
  return toReturn;
}

M row * N column
iterate M*N elements. for each elements, clear(M + N) times

So O((M * N)(M + N))  N^2


A better approach!!

Remembering which rows/columns need to be cleared.

void clear(int[][] input)
{
  // By default, all values are false.
  boolean[] rows = new boolean[input.length];
  boolean[] cols = new boolean[input[0].length];
  
  
  for (int i = 0 ; i < input.length ; i ++)
  {
    for (int j = 0 ; j < input[0].length ; j ++)
    {
      if (input[i][j] == 0)
      {
        rows[i] = true;
        cols[j] = true;
      }
    }
  }
  
  for (int i = 0 ; i < input.length ; i ++)
  {
    for (int j = 0 ; j < input[0].length ; j ++)
    {
      if (rows[i] || cols[j])
        input[i][j] = 0;
    }
  }
}

// O(M * N)


你可能感兴趣的:(interview)