给定一个 m x n 的矩阵,如果一个元素为 0,则将其所在行和列的所有元素都设为 0。请使用原地算法。
示例 1:
输入: [ [1,1,1], [1,0,1], [1,1,1] ] 输出: [ [1,0,1], [0,0,0], [1,0,1] ]
示例 2:
输入: [ [0,1,2,0], [3,4,5,2], [1,3,1,5] ] 输出: [ [0,0,0,0], [0,4,5,0], [0,3,1,0] ]
进阶:
- 一个直接的解决方案是使用 O(mn) 的额外空间,但这并不是一个好的解决方案。
- 一个简单的改进方案是使用 O(m + n) 的额外空间,但这仍然不是最好的解决方案。
- 你能想出一个常数空间的解决方案吗?
分析:
遍历矩阵,如果遇到了0,就把它的坐标保存下来。遍历完成后,按照坐标,依次删除对应的行和列。
class Solution {
public:
void setZeroes(vector<vector<int>>& matrix) {
// 保存每一个0的坐标,最后整体擦除
vector<int> locate;
for(int i=0; i<matrix.size(); i++){
// 每一行
vector<int> row = matrix[i];
for(int j=0; j<row.size(); j++){
if(row[j] == 0){
locate.push_back(i);
locate.push_back(j);
}
}
}
// 擦除
for(int i=0; i<locate.size(); i += 2)
erase(matrix,locate[i],locate[i+1]);
return;
}
void erase(vector<vector<int>>& matrix,int i,int j){
for(int n=0; n<matrix[i].size(); n++)
matrix[i][n] = 0;
for(int n=0; n<matrix.size(); n++)
matrix[n][j] = 0;
}
};