编写一种算法,若M × N矩阵中某个元素为0,则将其所在的行与列清零
class Solution {
public:
void setZeroes(vector<vector<int>>& matrix) {
unordered_set<int> zero_row;
unordered_set<int> zero_col;
unordered_set<int>::iterator it_row;
unordered_set<int>::iterator it_col;
int row = matrix.size();
int col = matrix[0].size();
for(int i = 0; i < row; i++) {
for(int j = 0; j < col; j++) {
if(matrix[i][j] == 0) {
zero_row.insert(i);
zero_col.insert(j);
}
}
}
for(it_row = zero_row.begin(); it_row != zero_row.end(); it_row++) {
for(int j = 0; j < col; j++) {
matrix[*it_row][j] = 0;
}
}
for(it_col = zero_col.begin(); it_col != zero_col.end(); it_col++) {
for(int i = 0; i < row; i++) {
matrix[i][*it_col] = 0;
}
}
}
};
把0元素的横纵坐标分别用所在列、所在行的第一个元素变成0来记录,因为迟早都会被清零。
最后清零时遍历第一行和第一列,然后对其行、列赋0即可。
0行0列需要额外考虑
class Solution {
public:
void setZeroes(vector<vector<int>>& matrix) {
int row = matrix.size();
int col = matrix[0].size();
if(row <= 0 || col <= 0)
return;
if(row == 1 && col == 1)
return;
int _0_0_row = 0;
int _0_0_col = 0;
for(int i = 0; i < row; i++) {
if(matrix[i][0] == 0) {
_0_0_col = 1;
break;
}
}
for(int j = 0; j < col; j++) {
if(matrix[0][j] == 0) {
_0_0_row = 1;
break;
}
}
for(int i = 1; i < row; i++) {
for(int j = 1; j < col; j++) {
if(matrix[i][j] == 0) {
matrix[i][0] = 0;
matrix[0][j] = 0;
}
}
}
for(int i = 1; i < row; i++) {
if(matrix[i][0] == 0) {
for(int j = 1; j < col; j++) {
matrix[i][j] = 0;
}
}
}
for(int j = 1; j < col; j++) {
if(matrix[0][j] == 0) {
for(int i = 1; i < row; i++) {
matrix[i][j] = 0;
}
}
}
if(_0_0_row == 1) {
for(int j = 0; j < col; j++) {
matrix[0][j] = 0;
}
}
if(_0_0_col == 1) {
for(int i = 0; i < row; i++) {
matrix[i][0] = 0;
}
}
}
};