解题思路
原地算法:输出结果覆盖输入结果,不额外开辟内存和空间
具体步骤:
1.使用两个标记量记录首行首列是否需要置零
2.扫描非首行首列的置零信息
3.回过头来将根据标记量将首行首列是否置零
代码
class Solution {
public:
void setZeroes(vector<vector<int>>& matrix) {
int m = matrix.size();//行
int n = matrix[0].size();//列
int col0 = false, row0 = false;
//1.扫描首行首列是否需要被置零
for(int i = 0;i < m; i++){
if(!matrix[i][0]){//首列有零存在
col0 = true;//列标记位记为真
}
}
for(int j = 0;j < n;j ++){
if(!matrix[0][j]){//首行有零存在
row0 = true;//行标记位记为真
}
}
//2.扫描非首行首列的置零信息
for(int i = 1;i < m; i++){
for(int j =1 ;j < n;j++){
if(!matrix[i][j]){//该行列有0
matrix[i][0] = matrix[0][j] = 0;//整行列都为0
}
}
}
for(int i = 1;i < m; i++){
for(int j =1 ;j < n;j++){
if(!matrix[i][0]||!matrix[0][j]){
matrix[i][j] = 0; //行列交叉点为置零
}
}
}
//3.回过头来对首行首列是否置零
if(col0){//首列有0
for(int i = 0;i < m;i++){
matrix[i][0] =0;//首列为零
}
}
if(row0){//首行有0
for(int j = 0;j < n;j++){
matrix[0][j] =0;//首行为零
}
}
}
};