73. 矩阵置零
73. 矩阵置零
给定一个 *m* x *n*
的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。
示例 1:
输入:matrix = [[1,1,1],[1,0,1],[1,1,1]]
输出:[[1,0,1],[0,0,0],[1,0,1]]
示例 2:
输入:matrix = [[0,1,2,0],[3,4,5,2],[1,3,1,5]]
输出:[[0,0,0,0],[0,4,5,0],[0,3,1,0]]
提示:
m == matrix.length
n == matrix[0].length
1 <= m, n <= 200
-231 <= matrix[i][j] <= 231 - 1
进阶:
- 一个直观的解决方案是使用
O(*m**n*)
的额外空间,但这并不是一个好的解决方案。 - 一个简单的改进方案是使用
O(*m* + *n*)
的额外空间,但这仍然不是最好的解决方案。 - 你能想出一个仅使用常量空间的解决方案吗?
思路:
O(1)空间复杂度解法:使用第一行和第一列来记录本行或本列是否有0,使用两次遍历,
第一次遍历如果一个位置为0,那么就把元素所在的行列首置0,
第二次遍历去更新即可,注意第二次时从下向上遍历,因为如果从上向下遍历,那么会影响剩下遍历的结果。
class Solution {
public:
void setZeroes(vector<vector<int>>& matrix) {
int m=matrix.size();
int n=matrix[0].size();
bool col0=false;//记录第一列原本是否有0 因为第一列要用来记录本行是否有0
for(int i=0;i<m;i++){
if(!matrix[i][0])col0=true;
for(int j=1;j<n;j++){
if(!matrix[i][j])//如果该位置为0
{
matrix[i][0]=matrix[0][j]=0;//把该位置的首行首列置0
}
}
}
for(int i=m-1;i>=0;i--){
for(int j=1;j<n;j++){
if(!matrix[i][0]||!matrix[0][j])//只要该位置所在行列首个元素是0 ,那么它就要置0
matrix[i][j]=0;
}
if (col0) {
matrix[i][0] = 0;
}
}
}
};
本文来自博客园,作者:{BailanZ},转载请注明原文链接:https://www.cnblogs.com/BailanZ/p/16300394.html