题目

暴力
思路: 先记录所有零元素的位置,再遍历矩阵,将对应行和列置为 0。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| class Solution { public: void setZeroes(vector<vector<int>>& matrix) { int m = matrix.size(); int n = matrix[0].size();
vector<pair<int, int>> zeros;
for (int i = 0; i < m; ++i) { for (int j = 0; j < n; ++j) { if (matrix[i][j] == 0) { zeros.push_back({i, j}); } } }
for (auto [r, c] : zeros) { for (int j = 0; j < n; ++j) { matrix[r][j] = 0; }
for (int i = 0; i < m; ++i) { matrix[i][c] = 0; } } } };
|
复杂度:
- 时间:
O(mn + k(m+n)),k 为零元素个数
- 空间:
O(k)
优化
思路: 使用两个数组分别记录需要置零的行和列,最后统一修改矩阵。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| class Solution { public: void setZeroes(vector<vector<int>>& matrix) { int m = matrix.size(); int n = matrix[0].size();
vector<bool> rows(m, false); vector<bool> cols(n, false);
for (int i = 0; i < m; ++i) { for (int j = 0; j < n; ++j) { if (matrix[i][j] == 0) { rows[i] = true; cols[j] = true; } } }
for (int i = 0; i < m; ++i) { for (int j = 0; j < n; ++j) { if (rows[i] || cols[j]) { matrix[i][j] = 0; } } } } };
|
复杂度:
最优
思路: 使用矩阵的第一行和第一列记录对应行列是否需要置零,并单独记录第一行、第一列原本是否含零。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
| class Solution { public: void setZeroes(vector<vector<int>>& matrix) { int m = matrix.size(); int n = matrix[0].size();
bool firstRowZero = false; bool firstColZero = false;
for (int j = 0; j < n; ++j) { if (matrix[0][j] == 0) { firstRowZero = true; } }
for (int i = 0; i < m; ++i) { if (matrix[i][0] == 0) { firstColZero = true; } }
for (int i = 1; i < m; ++i) { for (int j = 1; j < n; ++j) { if (matrix[i][j] == 0) { matrix[i][0] = 0; matrix[0][j] = 0; } } }
for (int i = 1; i < m; ++i) { for (int j = 1; j < n; ++j) { if (matrix[i][0] == 0 || matrix[0][j] == 0) { matrix[i][j] = 0; } } }
if (firstRowZero) { for (int j = 0; j < n; ++j) { matrix[0][j] = 0; } }
if (firstColZero) { for (int i = 0; i < m; ++i) { matrix[i][0] = 0; } } } };
|
复杂度: