题目描述
给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。
思路
在原数组上直接操作势必会出现"冗余"的0,即原本[i,j]处不是0,例如由于i行的其他位置有0导致[i,j]处被置0,从而j列本来没有0却被置0。因此需要辅助数组来存储需要被置0的位置,在遍历后再秋后算账。朴素的想法就是空间复杂度O(mn),优化一下只存行号和列号就是O(m+n),再优化就可以直接用矩阵的第0行和第0列来充当辅助数组,复杂度O(1),但需要注意的是一开始要避开第0行和第0列,以免辅助数组中出现"冗余"的0。
代码
cpp
class Solution {
public:
void setZeroes(vector<vector<int>>& matrix) {
int m=matrix.size();
int n=matrix[0].size();
int i,j;
bool flag_m=false,flag_n=false;
for(i=0;i<m;i++)
if(matrix[i][0]==0)
flag_n=true;//检测原始第一列是否应置为0
for(j=0;j<n;j++)
if(matrix[0][j]==0)
flag_m=true;//检测原始第一行是否应置为0
for(i=0; i<m;i++){
for(j=0; j<n;j++){
if(matrix[i][j]==0){
matrix[0][j]=0;
matrix[i][0]=0;
}
}
}
for(i=1; i<m;i++){//先避开第一行
if(matrix[i][0]==0){
for(j=1; j<n;j++){
matrix[i][j]=0;
}
}
}
for(j=1; j<n; j++){//先避开第一列
if(matrix[0][j]==0){
for(i=1; i<m; i++){
matrix[i][j]=0;
}
}
}
if(flag_m)
for(j=0; j<n;j++)
matrix[0][j]=0;
if(flag_n)
for(i=0;i<m;i++)
matrix[i][0]=0;
}
};