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; } }
没有评论:
发表评论