法一:找到第一个为0的元素的行row和列col,用第row行和第col列的其余位置来记录其余行列清零情况
class Solution {
public:
void setZeroes(vector<vector<int>>& matrix) {
//找到第一个为0的元素的行row和列col
//用那一行和列的其余位置来记录其余行列清零情况
int col = -1;
int row = -1;
int flag = 0;
for(int i = 0; i < matrix.size(); i++){
for(int j = 0; j < matrix[0].size(); j++){
if(matrix[i][j] == 0){
row = i;
col = j;
flag = 1;
break;
}
}
if(flag) break;
}
if(flag == 0) return;
//记录清零情况
for(int i = row; i < matrix.size(); i++){
for(int j = 0; j < matrix[0].size(); j++){
if(matrix[i][j] == 0){
matrix[i][col] = 0;
matrix[row][j] = 0;
}
}
}
//行清零
for(int i = 0; i < matrix.size(); i++){
if(i == row) continue;
if(matrix[i][col] == 0){
for(int j = 0; j < matrix[0].size(); j++){
matrix[i][j] = 0;
}
}
}
//列清零
for(int j = 0; j < matrix[0].size(); j++){
if(j == col) continue;
if(matrix[row][j] == 0){
for(int i = 0; i < matrix.size(); i++){
matrix[i][j] = 0;
}
}
}
//row和col所在行列清零
for(int i = 0; i < matrix.size(); i++){
matrix[i][col] = 0;
}
for(int j = 0; j < matrix[0].size(); j++){
matrix[row][j] = 0;
}
}
};
法二:用额外数组来需要清零的行和列
class Solution {
public:
void setZeroes(vector<vector<int>>& matrix) {
vector<int> row(matrix.size());
vector<int> col(matrix[0].size());
for(int i = 0; i < matrix.size(); i++){
for(int j = 0; j < matrix[0].size(); j++){
if(matrix[i][j] == 0){
row[i] = 1;
col[j] = 1;
}
}
}
for(int i = 0; i < matrix.size(); i++){
for(int j = 0; j < matrix[0].size(); j++){
if(row[i] || col[j])
matrix[i][j] = 0;
}
}
}
};