将矩阵中0元素的行和列都变成0,如果正常做非常好做,只要遍历一遍记录0的位置,然后第二遍遍历将该行和列变成0即可。但这样需要用到空间复杂度为O(mn)时间O(m+n)
第二种在找0 的过程中就把矩阵中的行和列都变成一个设置的值(不是0),第二遍遍历将这种值的位置都变成0,但这样每个0元素都会遍历m+n次,所以为O(mn)*(m+n)空间为O(1)
第三种在找到0后将列首和行首的两个元素变成0,这样只需遍历两个即可给行和列赋值,不用重复赋值,但要注意第一行和第一列的第一个都是0,0,所以需要额外用一个变量标志第一列是否需要变0.标志完后从(1,1)开始看这个位置是否需要变0,再看第一行是否需要变。完成后再看第一列单独是否需要赋值。(记得时先看行再看列,因为行需要看0,0,别让列先变了)。
时间为O(mn),空间为O(1)
class Solution {
public void setZeroes(int[][] matrix) {
if(matrix==null || matrix.length==0)return;
boolean colNeed=false;
for(int i=0;i<matrix.length;i++){
if(matrix[i][0]==0)colNeed=true;
for(int j=1;j<matrix[0].length;j++){
if(matrix[i][j]==0){
matrix[0][j]=0;
matrix[i][0]=0;
}
}
}
for(int i=1;i<matrix.length;i++){
for(int j=1;j<matrix[0].length;j++){
if(matrix[i][0]==0 || matrix[0][j]==0){
matrix[i][j]=0;
}
}
}
if(matrix[0][0]==0){
for(int i=0;i<matrix[0].length;i++){
matrix[0][i]=0;
}
}
if(colNeed){
for(int i=0;i<matrix.length;i++){
matrix[i][0]=0;
}
}
}
}