面试题 01.08. 零矩阵

题目:

 

 

解答:

 常量空间的话,第一可以考虑是不是固定数量的几个变量能搞定;否则可以考虑是不是问题本身已经提供了足够的空间。
    这道题目属于后者,就是利用矩阵的第一行和第一列来作为辅助空间使用。不用开辟新的存储空间。方法就是:
    A. 先确定第一行和第一列是否需要清零;
    B. 扫描剩下的矩阵元素,如果遇到了0,就将对应的第一行和第一列上的元素赋值为0;
    C. 根据第一行和第一列的信息,已经可以将剩下的矩阵元素赋值为结果所需的值了;
    D. 根据1中确定的状态,处理第一行和第一列;

class Solution {
public:
    void setZeroes(vector<vector<int>>& matrix) 
    {
          int rows = matrix.size();
        if(0 == rows)
        {
            return;
        }
        int cols = matrix[0].size();
        if(0 == cols)
        {
            return;
        }
        //using first row and col as storage
        //1.search zero in first row and col to determin it's own status
        bool zerorow0 = false;
        bool zerocol0 = false;
        for(int ci = 0; ci < cols; ++ci)
        {
            if(matrix[0][ci] == 0)
            {
                zerorow0 = true;
                break;
            }
        }
        for(int ri = 0; ri < rows; ++ri)
        {
            if(matrix[ri][0] == 0)
            {
                zerocol0 = true;
                break;
            }
        }
        
        //2.search zeros in other position to sign the first row and col
        for(int ri = 1; ri < rows; ++ri)
        {
            for(int ci = 1; ci < cols; ++ci)
            {
                if(matrix[ri][ci] == 0)
                {
                    matrix[0][ci] = 0;
                    matrix[ri][0] = 0;
                }
            }
        }
        
        //3.set zeroes in other positions according to first col and row
        for(int ri = 1; ri < rows; ++ri)
        {
            for(int ci = 1; ci < cols; ++ci)
            {
                if(matrix[0][ci] == 0 || matrix[ri][0] == 0)
                {
                    matrix[ri][ci] = 0;
                }
            }
        }
        
        //4.set zeroes for first row and col
        if(zerorow0)
        {
            for(int ci = 0; ci < cols; ++ci)
            {
                matrix[0][ci] = 0;
            }
        }
        if(zerocol0)
        {
            for(int ri = 0; ri < rows; ++ri)
            {
                matrix[ri][0] = 0;
            }
        }

    }
};

 

posted @ 2020-05-09 22:51  梦醒潇湘  阅读(182)  评论(0)    收藏  举报