73. Set Matrix Zeroes

每日一题 2019 - 04 - 08

题目:

Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in-place.

Example 1:

1
2
3
4
5
6
7
8
9
10
11
12
Input: 
[
[1,1,1],
[1,0,1],
[1,1,1]
]
Output:
[
[1,0,1],
[0,0,0],
[1,0,1]
]

Example 2:

1
2
3
4
5
6
7
8
9
10
11
12
Input: 
[
[0,1,2,0],
[3,4,5,2],
[1,3,1,5]
]
Output:
[
[0,0,0,0],
[0,4,5,0],
[0,3,1,0]
]

Follow up:

  • A straight forward solution using O(m**n) space is probably a bad idea.
  • A simple improvement uses O(m + n) space, but still not the best solution.
  • Could you devise a constant space solution?

解法:

这个题需要使用 in-place算法进行求解,这个算法的思路也即牺牲时间来提高空间复杂度的有效性,所以可以考虑使用多次循环来解决问题,思路如下:

  • 使用第一行第一列的元素来记录下需要置零的行和列,当然第一行第一列自身也需要进行判断需不需要置零
  • 先从第二行第二列开始遍历整体元素,如果matrix[i][j] 为 0 ,那么需要把第 i 行置零,第 j 列置零,这时候需要将matrix[i][0] 置零, matrix[0][j] 置零
  • 遍历第一行的所有元素,如果遇到 0 ,该元素处的这一列全部置 0
  • 遍历第一列的所有元素,如果遇到 0 ,该元素处的这一行全部置 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
class Solution {
public:
void setZeroes(vector<vector<int>>& matrix) {
int rowLen = matrix.size(), colLen = matrix[0].size();
bool firstRow = false, firstCol = false;
for (int i = 0; i < rowLen; i++){
if (matrix[i][0] == 0){
firstRow = true; break;
}
}
for (int j = 0; j < colLen; j++){
if (matrix[0][j] == 0){
firstCol = true; break;
}
}
for (int i = 1; i < rowLen; i++){
for (int j = 1; j < colLen; j++){
if (!matrix[i][j]){
matrix[i][0] = 0; matrix[0][j] = 0;
}
}
}

for (int i = 1; i < rowLen; i++){
if (!matrix[i][0]){
for (int j = 1; j < colLen; j++)
matrix[i][j] = 0;
}
}

for (int j = 1; j < colLen; j++){
if (!matrix[0][j]){
for (int i = 1; i < rowLen; i++)
matrix[i][j] = 0;
}
}

if (firstRow){
for (int i = 0; i < rowLen; i++)
matrix[i][0] = 0;
}
if (firstCol){
for (int j = 0; j < colLen; j++)
matrix[0][j] = 0;
}
}
};
0%
undefined