Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place.
Follow up:
解法一:额外生成一个mxn的矩阵A,用于保存有零的位置,然后根据A矩阵中为零的i,j位置,将输入矩阵的i行j列分别置零,额外空间复杂度为O(m*n)。
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?
解法二:额外生成两个set集合,分别用于存放有0的行号i、列号j,最后扫描set集合中i,j的位置,即可得到结果,额外的空间复杂度为O(m+n)。
解法三:扫描矩阵,如果matrix[i][j] == 0,则将matrix[i][0]、matrix[0][j]置零,用于标记该行和该列后续需置零,对于第一行和第一列需要做一些是否有零的标记,本解法的空间复杂度为O(1),程序如下所示:
class Solution {
public void setZeroes(int[][] matrix) {
int row = matrix.length, col = matrix[0].length;
boolean firstRowContainsZero = false, firstColContainsZero = false;
for (int i = 0; i < row; i ++){
for (int j = 0; j < col; ++ j){
if (matrix[i][j] == 0){
matrix[i][0] = 0;
matrix[0][j] = 0;
if (i == 0){
firstColContainsZero = true;
}
if (j == 0){
firstRowContainsZero = true;
}
}
}
}
for (int i = 1; i < col; ++ i){
if (matrix[0][i] == 0){
for (int j = 1; j < row; ++ j){
matrix[j][i] = 0;
}
}
}
if (firstColContainsZero){
for (int i = 0; i < col; ++ i){
matrix[0][i] = 0;
}
}
for (int i = 1; i < row; ++ i){
if (matrix[i][0] == 0){
for (int j = 1; j < col; ++ j){
matrix[i][j] = 0;
}
}
}
if (firstRowContainsZero){
for (int i = 0; i < row; ++ i){
matrix[i][0] = 0;
}
}
}
}