题目

image

暴力

思路: 先记录所有零元素的位置,再遍历矩阵,将对应行和列置为 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;
}
}
}
}
};

复杂度:

  • 时间:O(mn)
  • 空间:O(m+n)

最优

思路: 使用矩阵的第一行和第一列记录对应行列是否需要置零,并单独记录第一行、第一列原本是否含零。

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;
}
}
}
};

复杂度:

  • 时间:O(mn)
  • 空间:O(1) 額外空间