leetcode 73 矩阵置零

想到了初始化一个m+n的bool数组变量,之后遍历矩阵,遇到0,就给对应的行与列置为true。完成第一次遍历之后,就是第二次,根据得到的bool数组值将对应的行列值0。

class Solution {
public:
    void setZeroes(vector<vector<int>>& matrix) 
    {
        int m = matrix.size();
        int n = matrix[0].size();
        bool judge[400] = {false};
        for(int i = 0 ; i < m ; i++)
        {
            for(int j = 0 ; j < n ; j++)
            {
                if(matrix[i][j] == 0)
                {
                    judge[i] = true;
                    judge[m+j] = true;
                }
            }
        }
        for(int i = 0 ; i < m ; i++)
        {
            for(int j = 0 ; j < n ; j++)
            {
                if(judge[i] || judge[m+j])
                matrix[i][j] = 0;
            }
        }
        
    }
};

  第二种方法,使用矩阵的内存来标识,使用每一列的第一个元素来标记每一行是否出现0,使用一个额外变量来表示第一列是否有0,在最后的时候对最后一列进行处理,为了促进理解,用行列倒置的方法重新写了一下。

class Solution {
public:
    void setZeroes(vector<vector<int>>& matrix) 
    {
        int flag = false;
        int m = matrix.size();
        int n = matrix[0].size();
        for(int i = 0 ; i < n ; i++)
        {
            if(!matrix[0][i])
            flag = true;
        }
        for(int j = 1 ; j < m ; j++)
        {
            for(int i = 0 ; i < n ; i++)
            {
                if(!matrix[j][i])
                matrix[j][0] = matrix[0][i] = 0;
            }
        }
        for(int i = n-1 ; i >= 0 ; i--)
        {
            for(int j = 1 ; j < m ; j++)
            {
                if(!matrix[j][0] || !matrix[0][i])
                matrix[j][i] = 0;
            }
            if(flag)
            matrix[0][i] = 0;
        }
        

    }
};

  矩阵中的每一个元素是否为0,都要受到其行与列的约束,这种方法的特征为使用一个额外变量来实现对第一列或者第一行的某一个约束,从而使其实现对其他元素的约束,完成后在通过这个额外变量完成约束。

posted @ 2021-08-16 14:14  zhaohhhh  阅读(39)  评论(0)    收藏  举报