矩阵置零

空间复杂度O(m+n),记录要变为0的行和列(m+n)
时间复杂度O(2mn) => 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
/**
* @param {number[][]} matrix
* @return {void} Do not return anything, modify matrix in-place instead.
*/
var setZeroes = function (matrix) {
// 行
const row = matrix.length;
const col = matrix[0].length;
const zeroRow = Array(row).fill(false);
const zeroCol = Array(col).fill(false);
for (let i = 0; i < row; ++i) {
for (let j = 0; j < col; ++j) {
if (matrix[i][j] === 0) {
zeroRow[i] = true;
zeroCol[j] = true;
}
}
}
for (let i = 0; i < row; ++i) {
if (!zeroRow[i]) continue;
for (let j = 0; j < col; ++j) {
matrix[i][j] = 0;
}
}
for (let i = 0; i < col; ++i) {
if (!zeroCol[i]) continue;
for (let j = 0; j < row; ++j) {
matrix[j][i] = 0;
}
}
return matrix;
};

优化到常量的空间复杂度
通过首行,首列来标记是否要置零

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
/**
* @param {number[][]} matrix
* @return {void} Do not return anything, modify matrix in-place instead.
*/
var setZeroes = function (matrix) {
const rowLen = matrix.length;
const colLen = matrix[0].length;
let firstRowZero = false,
firstColZero = false;
for (let i = 0; i < rowLen; i++) {
if (matrix[i][0] === 0) {
firstColZero = true;
}
}
for (let i = 0; i < colLen; i++) {
if (matrix[0][i] === 0) {
firstRowZero = true;
}
}
for (let i = 1; i < rowLen; i++) {
for (let j = 1; j < colLen; j++) {
if (matrix[i][j] === 0) {
matrix[i][0] = 0;
matrix[0][j] = 0;
}
}
}
for (let i = 1; i < rowLen; i++) {
for (let j = 1; j < colLen; j++) {
if (matrix[i][0] === 0 || matrix[0][j] === 0) {
matrix[i][j] = 0;
}
}
}
// 处理首行、首列
if (firstRowZero) {
for (let i = 0; i < colLen; i++) {
matrix[0][i] = 0;
}
}
if (firstColZero) {
for (let i = 0; i < rowLen; i++) {
matrix[i][0] = 0;
}
}
return matrix;
};

本站由 ao 使用 Stellar 1.29.1 主题创建。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。