73. Set Matrix Zeroes
99%
,差不多100%
,第一个版本解不是常数空间复杂度,这次更新常数复杂度的,讲一下思路。
- 矩阵中某个数为零,则将该数所在行的第一个数置零,所在列的第一个数置零,即
matrix[0][j] = matrix[i][0] = 0;
,这样并不会影响该列该行首个数的取值,因为他们最后都会被置零。即让首行首列记录哪一列有零,哪一行有零 - 遍历矩阵中非首行首列的每个元素,如果所在行首或者列首元素为零,则说明该行该列应该都为零,将该元素置零,最后达到目的
- 第一步操作可能会让首行首列是否有零这个信息损失掉,因为首行首列被用来存储其他信息了,会改变他们的取值,所以再定义两个变量
row0
,col0
记录首行首列是否有零,并且这一步需要放在前面 - 总共定义了四个
int
变量,符合常数空间复杂度的要求
class Solution {
public:
void setZeroes(vector<vector<int>>& matrix) {
int m = matrix.size();
if (m == 0) return ;
int n = matrix[0].size();
bool row0 = false, col0 = false;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (matrix[i][j] == 0) {
if (i == 0) row0 = true;
if (j == 0) col0 = true;
matrix[0][j] = matrix[i][0] = 0;
}
}
}
for (int i = 1; i < m; i++) {
for (int j = 1; j < n; j++) {
if (matrix[0][j] == 0 || matrix[i][0] == 0)
matrix[i][j] = 0;
}
}
if (col0)
for (int i = 0; i < m; i++) matrix[i][0] = 0;
if (row0)
for (int j = 0; j < n; j++) matrix[0][j] = 0;
}
};