🔗 https://leetcode.cn/problems/set-matrix-zeroes
题目
- 给一个 n * m 的二维数组,如果有一个 0 元素,则把对应的行列都置为零
- 要求 in-place
思路
- 直观的想法是遍历一遍矩阵,用 set 分别记录下 0 元素对应的行和列,再遍历下矩阵,对命中相关行列的元素置零。不过该方法不符合题目要求,需要有额外的存储空间
- 取第一行和第一列作为标记位,把 0 元素对应的 [row][0] [0][col] 设置为 0,遍历矩阵时根据这些标志位,判断当前元素是否需要设置为 0
- 需要特殊处理下第一行和第一列的 0 元素,避免在遍历的过程中标志位被修改
代码
class Solution {
public:
void setZeroes(vector<vector<int>>& matrix) {
bool mark_row = 0, mark_col = 0;
for (int i = 0; i < matrix.size(); i++) {
for (int j = 0; j < matrix[i].size(); j++) {
if (matrix[i][j] == 0) {
if (i == 0) {
mark_row = true;
}
if (j == 0) {
mark_col = true;
}
if(i== 0 || j == 0) continue;
matrix[i][0] = 0;
matrix[0][j] = 0;
}
}
}
for (int i = 1; i < matrix.size(); i++) {
for (int j = 1; j < matrix[i].size(); j++) {
if (matrix[i][0] == 0) matrix[i][j] = 0;
if (matrix[0][j] == 0) matrix[i][j] = 0;
}
}
if (mark_row) {
for (int i = 0; i < matrix[0].size(); i++) matrix[0][i] = 0;
}
if (mark_col) {
for (int i = 0; i < matrix.size(); i++) matrix[i][0] = 0;
}
}
};v