leetcode hot100-18 矩阵置零

方法一:使用两个标记数组 row 和 col, 空间复杂度:O(m+n)

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

方法二:进行空间优化,空间复杂度:O(1)。我们只需要常数空间存储若干变量。

class Solution {
public:
    void setZeroes(vector>& matrix) {
        int m = matrix.size();
        int n = matrix[0].size();
        int flag_col0 = false, flag_row0 = false;

        // 记录第一列是否需要置零
        for (int i = 0; i < m; i++) {
            if (!matrix[i][0]) {  // 如果第一列有 0
                flag_col0 = true; // 记录下来
            }
        }
        // 记录第一行是否需要置零
        for (int j = 0; j < n; j++) {
            if (!matrix[0][j]) {  // 如果第一行有 0
                flag_row0 = true; // 记录下来
            }
        }
        // 利用第一行和第一列作为标记数组
        for (int i = 1; i < m; i++) {
            for (int j = 1; j < n; j++) {
                if (!matrix[i][j]) {
                    matrix[i][0] = matrix[0][j] = 0; // 记录到对应的第一列和第一行
                }
            }
        }

        for (int i = 1; i < m; i++) {
            for (int j = 1; j < n; j++) {
                if (!matrix[i][0] || !matrix[0][j]) { // 如果标记了该行或该列
                    matrix[i][j] = 0;                 // 置零
                }
            }
        }

        if (flag_col0) {
            for (int i = 0; i < m; i++) {
                matrix[i][0] = 0;
            }
        }

        if (flag_row0) {
            for (int j = 0; j < n; j++) {
                matrix[0][j] = 0;
            }
        }
    }
};

你可能感兴趣的:(leetcode,矩阵,算法)