美文网首页
018-Set Matrix Zeroes

018-Set Matrix Zeroes

作者: Woodlouse | 来源:发表于2020-05-26 21:53 被阅读0次

    描述

    在一个mxn的矩形中,设置矩形中的0元素所在的行、列的元素都设置为0,在原地执行这种操作。

    在实现需求时是否使用了额外空间?直观的方法是使用O(mxn)的额外空间,在改进一步就是使用O(m+n)的空间,但是还不是最好的方法,是否可以只使用常量级别的额外空间呢。

    分析

    简单的方法是记录所有的0元素所在的行列,然后再根据记录设置行列的元素都为0即可,这样需要O(m+n)的空间。

    代码实现如下:

    void setMatrixZeros00(vector<vector<int>>& matrix)
    {
        vector<int> zeroRows;
        vector<int> zeroCols;
        
        size_t m = matrix.size();
        size_t n = matrix[0].size();
        
        for(int i=0; i<m; ++i) {
            for (int j=0; j<n; ++j) {
                if (matrix[i][j] == 0) {
                    zeroRows.push_back(i);
                    zeroCols.push_back(j);
                }
            }
        }
        
        // 设置为0
        for (size_t i=0, cnt = zeroRows.size(); i<cnt; ++i) {
            fill(&matrix[zeroRows[i]][0], &matrix[zeroRows[i]][0]+n, 0);
        }
        
        for(size_t i=0, cnt=zeroCols.size(); i<cnt; ++i) {
            for(int j=0; j<m; j++) {
                matrix[j][zeroCols[i]] = 0;
            }
        }
    }
    

    使用常量空间的方法是借助辅助位,选定一行一列做为参考,为了遍历的方便性选择第一行第一列做为辅助元素:

    1,记录第一行、第一列是否有0元素;

    2,从辅助行列的下一行、下一列开始遍历元素,如果元素为0,则设置元素所在列的第一行、所在行的第一列的元素为0;

    3,从辅助行列的下一行、下一列开始遍历元素,如果遍历元素的第一行的此列、第一列此行的元素为0,则设置此元素为0;

    4,如果第一行、第一列起始时即存在0元素,则设置第一行、第一列所有元素为0;

    实现如下:

    //Time : O(mxn) Space : O(1)
    void setMatrixZeros01(vector<vector<int>>& matrix)
    {
        size_t m = matrix.size();
        size_t n = matrix[0].size();
        
        // 记录第1行、第1列是否有0
        bool zeroInFirstRow = false;
        bool zeroInFirstCol = false;
        
        for (size_t i=0; i<n; ++i) {
            if (matrix[0][i] == 0) {
                zeroInFirstRow = true;
                break;
            }
        }
        
        for (size_t i=0; i<m; ++i) {
            if (matrix[i][0] == 0) {
                zeroInFirstCol = true;
                break;
            }
        }
        
        // 从第二行、第二列开始遍历
        for(size_t i=1; i<m; ++i){
            for(size_t j=1; j<n; ++j) {
                if (matrix[i][j] == 0) {
                    matrix[0][j] = 0;
                    matrix[i][0] = 0;
                }
            }
        }
        
        // 进行第二次遍历,若某一个数对应的第一行中此列位置为0 或者 对应此数的第一列中此行位置的数字为0则设置为0
        for(size_t i=1; i<m; ++i) {
            for (size_t j=1; j<n; ++j) {
                if (matrix[0][j]==0 || matrix[i][0]==0) {
                    matrix[i][j] = 0;
                }
            }
        }
        
        // 进行第一行、第一列的操作
        if (zeroInFirstRow) {
            fill(&matrix[0][0], &matrix[0][0]+m, 0);
        }
        
        if (zeroInFirstCol) {
            for(size_t i=0; i<m; ++i) {
                matrix[i][0] = 0;
            }
        }
    }
    

    相关文章

      网友评论

          本文标题:018-Set Matrix Zeroes

          本文链接:https://www.haomeiwen.com/subject/ndsbahtx.html