73. 矩阵置零
自己想到了可是使用额外的O(m+n)空间来存储对应的m行或者n列是否含有0,但是想不到只用常数空间解决问题。
题解思路是使用原数组第一行和第一列标记此行或此列是否含有n,这样会覆盖第一行和第一列原来的数据,所以在第一次遍历获取标记之前使用两个值来记录第一行第一列本来是否含有零。
因为必须要先找到含有零的行和列,最后一起处理,所以要两次遍历,时间复杂度O(mn)
空间复杂度O(1)
class Solution {
public:
void setZeroes(vector<vector<int>>& matrix) {
int lsz=matrix.size();//行数
int csz=matrix[0].size();//列数
bool line=false;//第一行是否有零
bool column=false;//第一列是否有零
for(auto i:matrix[0]){
if(i==0){
line=true;
break;
}
}
for(int i=0;i<lsz;++i)
if(matrix[i][0]==0){
column=true;
break;
}
for(int i=1;i<lsz;++i){//第一次遍历进行标记
for(int j=1;j<csz;++j){
if(matrix[i][j]==0){
matrix[0][j]=0;
matrix[i][0]=0;
}
}
}
for(int i=1;i<lsz;++i){//第二次遍历根据标记置零
for(int j=1;j<csz;++j){
if(!matrix[i][0]||!matrix[0][j])
matrix[i][j]=0;
}
}
if(line)//最后根据标记改变第一行第一列
for(int& i:matrix[0])
i=0;
if(column){
for(int i=0;i<lsz;++i)
matrix[i][0]=0;
}
}
};