class Solution {
public:
void setZeroes(vector<vector<int>>& matrix) {
int m=matrix.size(),n=matrix[0].size();
bool firstrow=false,firstcol=false;
for(int i=0;i<n;i++) if(matrix[0][i]==0) firstrow=true;
for(int i=0;i<m;i++) if(matrix[i][0]==0) firstcol=true;
for(int i=1;i<m;i++)
for(int j=1;j<n;j++)
if(matrix[i][j]==0){
matrix[i][0]=0;
matrix[0][j]=0;
}
for(int i=1;i<m;i++)
for(int j=1;j<n;j++){
if(matrix[i][0]==0||matrix[0][j]==0)
matrix[i][j]=0;
}
if(firstrow==true)
for(int i=0;i<n;i++) matrix[0][i]=0;
if(firstcol==true)
for(int i=0;i<m;i++) matrix[i][0]=0;
}
};
不需要第一列和第一行都判断,只需要第一列或者第一行
此时由于第一行作仍作为基准列,但在遍历的范围内,最后置零时要按照列倒序,行可以顺序也可以逆序。防止按照列顺序,第一行都被置零,所有列由于第一行为零都要置零。
class Solution {
public:
void setZeroes(vector<vector<int>>& matrix) {
int m=matrix.size(),n=matrix[0].size();
bool firstcol=false;
for(int i=0;i<m;i++){
if(matrix[i][0]==0) firstcol=true;
for(int j=1;j<n;j++)
if(matrix[i][j]==0){
matrix[i][0]=0;
matrix[0][j]=0;
}
}
for(int i=m-1;i>=0;i--){
for(int j=1;j<n;j++){
if(matrix[i][0]==0||matrix[0][j]==0)
matrix[i][j]=0;
}
if(firstcol==true)
matrix[i][0]=0;
}
}
};