参考CC 150 1.7
一开始看起来这道题好像是很简单,遍历整个矩阵,发现0元素之后就将这个元素所在的行和列都设置成0,但是这样做的是错的,因为在读取被清零的行或者列的时候,读到的都是0,很快整个矩阵的所有元素都会变成0。
避开上面问题的方法是新建一个矩阵标记0元素的位置,然后在第二次遍历的时候将0元素所在的行和列清零,这种方法的空间复杂度是O(MN)。但是仔细想一下,我们实际上并不需要这么多的空间,因为我们既然准备将整行和整列设置为0,那么并不需要记录它是matrix[2][4]之类的,只需要知道第二行有个元素是0,第4列有个元素是0即可。不论怎样,整行/列都是要清零的。所以我们采用两个数组分别记录包含零元素的所有行和列,然后在第二次遍历矩阵的时候,如果所在的行或者列已经被标记为0,那么将这个元素设置为0,空间复杂度为O(M + N),代码如下:
public class Solution{
public void setZeros(int[][] matrix){
if(matrix == null || matrix.length == 0 || matrix[0].length == 0){
return;
}
boolean[] row = new boolean[matrix.length];
boolean[] column = new boolean[matrix[0].length];
// Record the row and column indexes of 0 element
for(int i = 0; i < matrix.length; i++){
for(int j = 0; j < matrix[0].length; j++){
if(matrix[i][j] == 0){
row[i] = true;
column[j] = true;
}
}
}
// If row[i] or column[j] is 0, set matrix[i][j] 0
for(int i = 0; i < matrix.length; i++){
for(int j = 0; j < matrix[0].length; j++){
if(row[i] || column[j]){
matrix[i][j] = 0;
}
}
}
}
}