Follow up:
Did you use extra space?
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?
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?
A naive way is to use extra array to record whether the row or the column should be set to zero or not. We could use the first column and first row of the matrix to do so. The time complexity would be O(mn) and space complexity would be O(1).
public void setZeroes(int[][] matrix) {
int m = matrix.length;
if(m == 0)
return; // corner case
int n = matrix[0].length;
boolean row = false, col = false; // check the first row and column
for(int i = 0; i < m; i++) {
if(matrix[i][0] == 0)
col = true;
}
for(int i = 0; i < n; i++) {
if(matrix[0][i] == 0)
row = true;
}
// check each row and column and store the information int the first row and column
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;
}
}
}
// set the matrix
for(int i = 1; i < m; i++) {
if(matrix[i][0] == 0) {
for(int j = 0; j < n; j++)
matrix[i][j] = 0;
}
}
for(int i = 1; i < n; i++) {
if(matrix[0][i] == 0) {
for(int j = 0; j < m; j++)
matrix[j][i] = 0;
}
}
if(row == true) {
for(int i = 0; i < n; i++)
matrix[0][i] = 0;
}
if(col == true) {
for(int i = 0; i < m; i++)
matrix[i][0] = 0;
}
}
没有评论:
发表评论