题目如下
数据范围
cpp
如果一个点m(i,j) == 0其中i j都大于0那么按照题目要求对应的m[0][j] m[i][0]都要赋值为0.
所以我们可以令第一行和第一列作为标记是否对应的列和行需要置为0.
又因为我们没法判断第一行和第一列所以需要额外两个变量标记第一列和第二列。
这样就可以满足题目要求的O(1)空间复杂度
通过代码
cpp
class Solution {
public:
void setZeroes(vector<vector<int>>& matrix) {
bool r = false, c = false;
int n = matrix.size();
int m = matrix[0].size();
for (int i = 0; i < n; i++) {
if (matrix[i][0] == 0) {
c = true;
break;
}
}
for (int i = 0; i < m; i++) {
if (matrix[0][i] == 0) {
r = true;
break;
}
}
for (int i = 1; i < n; i++) {
for (int j = 1; j < m; j++) {
if (matrix[i][j] == 0) {
matrix[0][j] = 0;
matrix[i][0] = 0;
}
}
}
for (int i = 1; i < n; i++) {
for (int j = 1; j < m; j++) {
if (!matrix[i][0] || !matrix[0][j]) {
matrix[i][j] = 0;
}
}
}
if (r) {
for (int i = 0; i < m; i++) {
matrix[0][i] = 0;
}
}
if (c) {
for (int i = 0; i < n; i++) {
matrix[i][0] = 0;
}
}
}
};
