73. Set Matrix Zeroes
Given an m x n integer matrix matrix, if an element is 0, set its entire row and column to 0’s.
You must do it in place.
Example 1:
Input: matrix = [[1,1,1],[1,0,1],[1,1,1]]
Output: [[1,0,1],[0,0,0],[1,0,1]]
Example 2:
Input: matrix = [[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]]
Constraints:
- m == matrix.length
- n == matrix[0].length
- 1 <= m, n <= 200
- − 2 31 < = m a t r i x [ i ] [ j ] < = 2 31 − 1 -2^{31}<= matrix[i][j] <= 2^{31} - 1 −231<=matrix[i][j]<=231−1
Follow up:
- A straightforward 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?
From: LeetCode
Link: 73. Set Matrix Zeroes
Solution:
Ideas:
The idea is to use the first row and the first column to store whether we need to set a whole row or column to zero. Before using the first row and column as storage, we should check if they themselves need to be set to zero.
The algorithm works as follows:
- Check if the first row and the first column should be set to zeroes. Store these decisions in two boolean variables.
- Iterate over the rest of the matrix. For each cell that is zero, set its corresponding entry in the first row and the first column to zero.
- Iterate over the matrix again (excluding the first row and column). For each cell, if its corresponding entry in the first row or the first column is zero, set the cell to zero.
- Based on the boolean variables from step 1, decide if the first row and the first column should be set to zero.
Code:
void setZeroes(int** matrix, int matrixSize, int* matrixColSize) {
int col0 = 1;
for (int i = 0; i < matrixSize; i++) {
if (matrix[i][0] == 0) {
col0 = 0;
}
for (int j = 1; j < matrixColSize[i]; j++) {
if (matrix[i][j] == 0) {
matrix[i][0] = 0;
matrix[0][j] = 0;
}
}
}
for (int i = matrixSize - 1; i >= 0; i--) {
for (int j = matrixColSize[i] - 1; j >= 1; j--) {
if (matrix[i][0] == 0 || matrix[0][j] == 0) {
matrix[i][j] = 0;
}
}
if (col0 == 0) {
matrix[i][0] = 0;
}
}
}