Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in-place.
Example
Solution 1: brute force
Consideration
- Use a boolean matrix to mark if the element has been set to 0.
- We iterate through the matrix. if the element is 0, we iterate the row and column. If the number in this row/column is not 0 and has not been set, we set it as 0 and mark it.
Time complexity:O(mnm) or O(mnn) depending on whether m or n is bigger, space complexity: O(m*n).
class Solution {
public void setZeroes(int[][] matrix) {
int rows = matrix.length;
int cols = matrix[0].length;
boolean[][] sets = new boolean[rows][cols];
for(int i = 0; i < rows; i++)
for(int j = 0; j < cols; j++) {
if(sets[i][j])
continue;
if(matrix[i][j] == 0) {
for(int k = 0; k < rows; k++) {
if(k != i && matrix[k][j] != 0 && !sets[k][j]) {
matrix[k][j] = 0;
sets[k][j] = true;
}
}
for(int k = 0; k < cols; k++) {
if(k != j && matrix[i][k] != 0 && !sets[i][k]) {
matrix[i][k] = 0;
sets[i][k] = true;
}
}
}
}
}
}
Solution 2: Additional Memory Approach
- Iterate through the matrix. If the number is 0, we add its row index and column index to the rows set and cols set.
- We iterate through the rows set and cols set separately to set whole row/column to be 0.
Time Complexity: O(3mn), space complexity: O(m+n)
class Solution {
public void setZeroes(int[][] matrix) {
int rows = matrix.length;
int cols = matrix[0].length;
Set<Integer> rowSets = new HashSet();
Set<Integer> colSets = new HashSet();
for(int i = 0; i < rows; i++)
for(int j = 0; j < cols; j++) {
if(matrix[i][j] == 0) {
rowSets.add(i);
colSets.add(j);
}
}
Iterator<Integer> ite = rowSets.iterator();
while(ite.hasNext()) {
int index = ite.next();
for(int i = 0; i < cols; i++) {
matrix[index][i] = 0;
}
}
ite = colSets.iterator();
while(ite.hasNext()) {
int index = ite.next();
for(int i = 0; i < rows; i++) {
matrix[i][index] = 0;
}
}
}
}
Solution 3
Consideration
- We can use the first row and first column of the matrix as a flag. This flag would determine whether a row or column should beset to zero.
- The first cell of row and column for the first row and first column is the same i.e. matrix[0][0]. So we use matrix[0][0] to represent the first row flag and create a flag to represent the first column flag.
- We iterate through the whole matrix to mark the flags.
- Then, we start from the second row and second column to the end. If the row flag or column flag is set, change the element to be 0.
- We then check if matrix[0][0] == 0. If yes, we set the first row elements.
- Finally, we check the first column flag. If yes, we set the first column elements.
Time complexity: O(m*n), space complexity: O(1)
class Solution {
public void setZeroes(int[][] matrix) {
int rows = matrix.length;
int cols = matrix[0].length;
Boolean setFirstCol = false;
// use the first row and first column as a flag to indidate if the row/column should be set as 0
for(int i = 0; i < rows; i++) {
//check first column
if(matrix[i][0] == 0)
setFirstCol = true;
for(int j = 1; j < cols; j++) {
if(matrix[i][j] == 0) {
matrix[i][0] = 0;
matrix[0][j] = 0;
}
}
}
//iterate over the matrix again, if the row/column should be set, set the element to 0
for(int i = 1; i < rows; i++)
for(int j = 1; j < cols; j++) {
if(matrix[i][0] == 0 || matrix[0][j] == 0)
matrix[i][j] = 0;
}
//check if the first row should be set as 0
if(matrix[0][0] == 0) {
for(int j = 1; j < cols; j++)
matrix[0][j] = 0;
}
//check if the first column should be set as 0
if(setFirstCol) {
for(int i = 0; i < rows; i++)
matrix[i][0] = 0;
}
}
}
Reference