给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。
思路:
1、让首行首列记录哪一行哪一列有0
2、于是可以直接遍历非首行首列的元素,若该元素对应的首行首列为0,说明该元素最后还是需要置0
3、由于首行首列还需要记录哪一行哪一列有0,所以第1步和第2步可能会有冲突,于是加入两个bool量,标志首行首列是否有0
cpp
class Solution {
public:
void setZeroes(vector<vector<int>>& matrix) {
int m = matrix.size(); // 行数
if(m==0)
return;
int n = matrix[0].size(); // 列数
bool row = false, col = false;
// 先完成标记首行首列是否有0
// 检查首列是否有0
for(int i=0; i<m; i++){
if(matrix[i][0] == 0){
col = true;
break;
}
}
// 检查首行是否有0
for(int j=0; j<n; j++){
if(matrix[0][j] == 0){
row = true;
break;
}
}
// 完成第一步
for(int i=1; i<m; i++){
for(int j=1; j<n; j++){
if(matrix[i][j] == 0){
// 首行首列置0
matrix[0][j] = 0;
matrix[i][0] = 0;
}
}
}
// 完成第二步
for(int i=1; i<m; i++){
for(int j=1; j<n; j++){
if(matrix[0][j]==0 || matrix[i][0] == 0){
matrix[i][j] = 0;
}
}
}
// 处理有0的首行首列
if(col){
for(int i=0; i<m; i++){
matrix[i][0] = 0;
}
}
if(row){
for(int j=0; j<n; j++){
matrix[0][j] = 0;
}
}
}
};