给定一个 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;
}
};
矩阵零元素处理算法
本文介绍了一种处理矩阵中零元素的算法,该算法能在遇到零元素时,将其所在行和列的所有元素设置为零。文章详细解释了算法的实现过程,并提供了两个示例来说明算法的工作原理。同时,文章探讨了不同空间复杂度的解决方案,包括O(mn),O(m+n)以及最优的常数空间解决方案。
1022

被折叠的 条评论
为什么被折叠?



