详细思路

用行数组,列数组,遍历一遍标记哪些行列要变成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列
posted on 2021-07-29 23:07  offer快到碗里来~  阅读(46)  评论(0)    收藏  举报