1. 题目
Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place.
对matrixi==0的部分,对i行、j列全部原地置为0.
2. 思路
找到第一个0的位置,将这个位置的行和列作为标记数组。
3. 代码
耗时:53ms
class Solution {
public:
// 遍历找到第一个0,用这个0所在的行和列作为对应行列是否有0的标记位组。
void setZeroes(vector<vector<int>>& matrix) {
if (matrix.size() == 0) { return ; }
// 计算行列为0的标签
int flag_i = -1;
int flag_j = -1;
for (int i = 0; i < matrix.size(); i++) {
vector<int>& line = matrix[i];
for (int j = 0; j < line.size(); j++) {
if (line[j] != 0) { continue; }
if (flag_i == -1) {
flag_i = i;
flag_j = j;
break; // 标签行可以跳过了
} else {
matrix[i][flag_j] = 0;
matrix[flag_i][j] = 0;
}
}
}
if (flag_i == -1) { return ; }
// 清理行列为0的
vector<int>& flag_line = matrix[flag_i];
for (int i = 0; i < matrix.size(); i++) {
if (i == flag_i) { continue; }
vector<int>& line = matrix[i];
for (int j = 0; j < line.size(); j++) {
if (j == flag_j) { continue; }
if (line[flag_j] == 0 || flag_line[j] == 0) {
line[j] = 0;
}
}
line[flag_j] = 0; // 最后清理一下标记列位
}
// 清理标记行
for (int j = 0; j < flag_line.size(); j++) { flag_line[j] = 0; }
return ;
}
};