c++
class Solution {
public:
void setZeroes(vector<vector<int>>& matrix) {
// 先遍历一遍二维数组,把需要置为0的行和列存入set中
// 再进行置0操作
unordered_set<int> rows;
unordered_set<int> cols;
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) {
rows.insert(i);
cols.insert(j);
}
}
}
for (auto& it : rows) {
for (int j = 0; j < col; j++) {
matrix[it][j] = 0;
}
}
for (auto& it : cols) {
for (int i = 0; i < row; i++) {
matrix[i][it] = 0;
}
}
}
};
优化空间复杂度为O(1)
class Solution {
public:
void setZeroes(vector<vector<int>>& matrix) {
// 1. 遍历二维数组,把发现0的行的第一个元素和列的第一个元素都置为0
// 之所以可以把它们用来做标记,是因为已经在前面遍历+考虑过了,故是什么无影响了
// 这里还需要记录第一行或第一列有没有初始0
// 2. 遍历二维数组进行置0操作,若元素所在行和列的第一个元素有0,则该元素置为0
// 最后如果第一行或第一列有初始0,则第一行或第一列全部置为0,不然会漏点第一行或第一列应该置为0的元素
int row = matrix.size();
int col = matrix[0].size();
int row0_has_zero = false, col0_has_zero = false;
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
if (matrix[i][j] == 0) {
if (i == 0) row0_has_zero=true;
if (j == 0) col0_has_zero=true;
matrix[i][0] = 0;
matrix[0][j] = 0;
}
}
}
// 这里遍历行和列都需要从第二个开始,是因为第一行和第一列被拿来用作标记了
// 其位置为0,不代表初始是否为0,无法判断
// 所以才需要两个布尔值额外判断第一行或第一列有没有初始0
for (int i = 1; i < row; i++) {
for (int j = 1; j < col; j++) {
if (matrix[i][0] == 0 || matrix[0][j] == 0) {
matrix[i][j] = 0;
}
}
}
if (row0_has_zero) {
for (int j = 0; j < col; j++) {
matrix[0][j] = 0;
}
}
if (col0_has_zero) {
for (int i = 0; i < row; i++) {
matrix[i][0] = 0;
}
}
}
};