
详细思路
用行数组,列数组,遍历一遍标记哪些行列要变成0,再遍历一遍变成0
精确定义
row i 下标为i的行
col j 下标为j的列
class Solution { public: void setZeroes(vector<vector<int>>& matrix) { int n=matrix.size(),m=matrix[0].size(); vector<int>row(n,0); vector<int>col(m,0); for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ if(matrix[i][j]==0)row[i]=1,col[j]=1; } } for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ if(row[i]||col[j])matrix[i][j]=0; } } return; } };
详细思路空间复杂度常量
用第0行第0列作为标记,要先用两个变量rowcol遍历标记是否第0行第0列有0,然后遍历其他行列是否有标记在00,然后清算其他行列,然后清算0行0列
class Solution { public: void setZeroes(vector<vector<int>>& matrix) { int n=matrix.size(),m=matrix[0].size(); bool row=false,col=false; for(int i=0;i<n;i++){ if(matrix[i][0]==0){ row=true; break; } } for(int j=0;j<m;j++){ if(matrix[0][j]==0){ col=true; break; } } for(int i=1;i<n;i++){ for(int j=1;j<m;j++){ if(matrix[i][j]==0){ matrix[i][0]=matrix[0][j]=0; } } } for(int i=1;i<n;i++){ for(int j=1;j<m;j++){ if(!matrix[i][0]||!matrix[0][j]){ matrix[i][j]=0; } } } if(row)for(int i=0;i<n;i++)matrix[i][0]=0; if(col)for(int j=0;j<m;j++)matrix[0][j]=0; return; } };
踩过的坑
matrix[i][0]=matrix[0][j]=0;
标记行列要用0不能用1,因为如果第0行第0列本来全是1,不会变
成0,那么你在遍历的时候是不能改第0行第0列的,必须在记录标记
行列的时候就已经修改了第0行第0列
浙公网安备 33010602011771号