73. Set Matrix Zeroes

2019/11/08 Leetcode

73. Set Matrix Zeroes

Tags: ‘Array’

Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in-place.

Example 1:

Input: 
[
  [1,1,1],
  [1,0,1],
  [1,1,1]
]
Output: 
[
  [1,0,1],
  [0,0,0],
  [1,0,1]
]

Example 2:

Input: 
[
  [0,1,2,0],
  [3,4,5,2],
  [1,3,1,5]
]
Output: 
[
  [0,0,0,0],
  [0,4,5,0],
  [0,3,1,0]
]

Follow up:

  • A straight forward solution using O(mn) space is probably a bad idea.
  • A simple improvement uses O(m + n) space, but still not the best solution.
  • Could you devise a constant space solution?

Solution

方法1 Use extra two arrays to store where a column/ row has 0.

O(m * n) time O(m + n) space


方法2 Use row 0 and column 0 to store if current row/column has 0. Finally iterate through matrix[i][j], if matrix[i][0] == 0 matrix[0][j] == 0, set matrix[i][j] 0.

O(m*n) time linear O(1) space

public void setZeroes(int[][] matrix) {
    final int m = matrix.length;
    final int n = matrix[0].length;
    boolean row_has_zero = false; // 第一行是否存在 0
    boolean col_has_zero = false; // 第一列是否存在 0

    for (int i = 0; i < n; i++)
        if (matrix[0][i] == 0) {
            row_has_zero = true;
            break;
        }

    for (int i = 0; i < m; i++)
        if (matrix[i][0] == 0) {
            col_has_zero = true;
            break;
        }

    for (int i = 1; i < m; i++)
        for (int j = 1; j < n; j++)
            if (matrix[i][j] == 0) {
                matrix[0][j] = 0;
                matrix[i][0] = 0;
            }
    for (int i = 1; i < m; i++)
        for (int j = 1; j < n; j++)
            if (matrix[i][0] == 0 || matrix[0][j] == 0)
                matrix[i][j] = 0;
    if (row_has_zero)
        for (int i = 0; i < n; i++)
            matrix[0][i] = 0;
    if (col_has_zero)
        for (int i = 0; i < m; i++)
            matrix[i][0] = 0;
}

Search

    Table of Contents