🧩Algo 矩阵

73. 矩阵置零

难度:🟡 Medium | 标签:矩阵、原地标记 | 状态:⬜ LeetCode 链接

思路

O(1) 空间:用第 0 行 / 第 0 列作为「这行 / 列要清零」的标记位。 但首行首列自己也可能被污染,先单独记录两个 bool。

代码

class Solution {
public:
    void setZeroes(vector<vector<int>>& m) {
        int R = m.size(), C = m[0].size();
        bool row0 = false, col0 = false;
        for (int j = 0; j < C; ++j) if (m[0][j] == 0) row0 = true;
        for (int i = 0; i < R; ++i) if (m[i][0] == 0) col0 = true;
        for (int i = 1; i < R; ++i)
            for (int j = 1; j < C; ++j)
                if (m[i][j] == 0) { m[i][0] = 0; m[0][j] = 0; }
        for (int i = 1; i < R; ++i)
            for (int j = 1; j < C; ++j)
                if (m[i][0] == 0 || m[0][j] == 0) m[i][j] = 0;
        if (row0) for (int j = 0; j < C; ++j) m[0][j] = 0;
        if (col0) for (int i = 0; i < R; ++i) m[i][0] = 0;
    }
};

复杂度

  • 时间 O(R · C),空间 O(1)

易错 / 回顾

  • 首行 / 首列必须先单独记录,否则被自己污染
  • 顺序:先记 row0/col0,再扫内部、写标记,再清内部,最后清首行首列
  • 用 O(R+C) 额外空间的版本更易写,但不是最优
Related · 矩阵