填充矩阵

题目:对于一个m*n的矩阵,如果某一个元素为0,则把该元素所在行及所在列均置为0。要求只允许使用O(1)的空间。

因为只允许使用O(1)的空间,因此需要使用矩阵内部的一部分元素来做标记。

void setZeroes(vector<vector<int> > &matrix) {
    int m = matrix.size();
    if (m == 0) return;
    int n = matrix[0].size();

    bool firstRowHas0(false);
    bool firstColHas0(false);
    int i,j;
    // 使用第一行和第一列来做标记,先记录第一行和第一列是否有0值
    for (i=0; i<m; i++) {
        if (!matrix[i][0]) {
            firstColHas0 = true;
            break;
        }
    }
    for (j=0; j<n; j++) {
        if (!matrix[0][j]) {
            firstRowHas0 = true;
            break;
        }
    }

    // 利用第一行和第一列来记录剩下的部分哪些行列有0值
    for (i=1; i<m; i++) {
        for (j=1; j<n; j++) {
            if (!matrix[i][j]) {
                matrix[0][j] = 0;
                matrix[i][0] = 0;
            }
        }
    }
    // 根据第一列的标记,对应的0值所在行均置为0
    for (i=1; i<m; i++) {
        if (!matrix[i][0]) {
            for (j=0; j<n; j++) {
                matrix[i][j] = 0;
            }
        }
    }
    // 根据第一行的标记,对应的0值所在列均置为0
    for (j=1; j<n; j++) {
        if (!matrix[0][j]) {
            for (i=0; i<m; i++) {
                matrix[i][j] = 0;
            }
        }
    }
    // 最后更新第一行和第一列的0值
    if (firstColHas0) {
        for (i=0; i<m; i++) {
            matrix[i][0] = 0;
        }
    }
    if (firstRowHas0) {
        for (j=0; j<n; j++) {
            matrix[0][j] = 0;
        }
    }
}

点赞