难度:中等。
标签:数组。
这个题要求使用常数空间进行解决,那就只能使用数组中的某行某列存储标记。
找到第一个值为0的元素,将其行索引
r
o
w
row
row和列索引
c
o
l
col
col存储下来,然后使用元素所在的行和列存储标记。
接下来继续遍历数组,若得到另一个为0的元素
m
a
t
r
i
x
[
i
]
[
j
]
matrix[i][j]
matrix[i][j],将其
m
a
t
r
i
x
[
r
o
w
]
[
j
]
matrix[row][j]
matrix[row][j]和
m
a
t
r
i
x
[
i
]
[
c
o
l
]
matrix[i][col]
matrix[i][col]置为0。
再次遍历row行的元素和col列的元素,若为0,改变其他同行或同列的元素。
正确解法:
class Solution {
public:
void setZeroes(vector<vector<int>>& matrix) {
int n1 = matrix.size(), n2 = matrix[0].size();
int flag = 1;
int row = -1, col = -1;
for(int i = 0; i < n1; i++){
for(int j = 0; j < n2; j++){
if(matrix[i][j] == 0 && flag){
row = i;
col = j;
flag = 0;
}
else if(matrix[i][j] == 0){
matrix[row][j] = 0;
matrix[i][col] = 0;
}
}
}
if(row == -1)return;
for(int i = 0; i < n1; i++){
if(matrix[i][col] == 0){
for(int j = 0; j < n2; j++){
if(i != row)matrix[i][j] = 0;
}
}
}
for(int j = 0; j < n2; j++){
if(matrix[row][j] == 0){
for(int i = 0; i < n1; i++)matrix[i][j] = 0;
}
}
for(int i = 0; i < n2; i++)matrix[row][i] = 0;
}
};
结果: