这一题实际上思路应该是选择矩阵中肯定被置0的行和列存储矩阵中其他行和列是否会被置0的状态,
我们可以把这额外选出来的行和列作为标志行和标志列。因此,在整个矩阵遍历过程中,都要对其特殊处理。
void setZeroes(vector<vector<int> > &matrix) {
if(matrix.empty())return;
int m=matrix.size();
int n=matrix[0].size();
int zeroRow=0,zeroCol=0;
bool find=false;
for(int i=0;i<m;i++){//寻找标志行和列
for(int j=0;j<n;j++){
if(!matrix[i][j]){find=true;zeroRow=i,zeroCol=j;break;}
}
if(find)break;
}
if(!find)return;
for(int i=0;i<m;i++){//存储各行和列状态
for(int j=0;j<n;j++){
if(i==zeroRow||j==zeroCol)continue;
if(!matrix[i][j]){
matrix[zeroRow][j]=0;
matrix[i][zeroCol]=0;
}
}
}
for(int i=0;i<m;i++){//根据标志行和标志列状态对除标志行和标志列之外的行和列置0
if(!matrix[i][zeroCol]){
for(int j=0;j<n;j++){
if(i==zeroRow||j==zeroCol)continue;
matrix[i][j]=0;
}
}
}
for(int j=0;j<n;j++){//根据标志行和标志列状态对除标志行和标志列之外的行和列置0
if(!matrix[zeroRow][j]){
for(int i=0;i<m;i++){
if(i==zeroRow||j==zeroCol)continue;
matrix[i][j]=0;
}
}
}
for(int j=0;j<n;j++)matrix[zeroRow][j]=0;//标志行和列置0
for(int i=0;i<m;i++)matrix[i][zeroCol]=0;
}
这中原地处理的程序,一定要特别注意从中选择出来的特殊空间的处理。