73. Set Matrix Zeroes
题目大意
Given an m x n
integer matrix matrix
, if an element is 0, set its entire row and column to 0’s. You must do it in place.
中文释义
给定一个 m x n
的整数矩阵 matrix
,如果一个元素为 0,则将其所在行和列的所有元素设置为 0。你必须就地完成这个操作。
示例
-
示例 1:
- 输入:
matrix = [[1,1,1],[1,0,1],[1,1,1]]
- 输出:
[[1,0,1],[0,0,0],[1,0,1]]
- 输入:
-
示例 2:
- 输入:
matrix = [[0,1,2,0],[3,4,5,2],[1,3,1,5]]
- 输出:
[[0,0,0,0],[0,4,5,0],[0,3,1,0]]
- 输入:
限制条件
m == matrix.length
n == matrix[0].length
1 <= m, n <= 200
-2^31 <= matrix[i][j] <= 2^31 - 1
后续思考
- 直接使用 O(mn) 空间的解决方案可能不是好主意。
- 一个简单的改进是使用 O(m + n) 空间,但仍然不是最佳解决方案。
- 你能想出一个常数空间的解决方案吗?
解题思路
方法:辅助空间
思路
这个解法使用两个辅助数组 row
和 col
来记录哪些行和列应该被置为零。如果矩阵中的某个元素为零,则将对应行和列的标记设置为 true
。在对矩阵的所有元素进行这样的标记之后,再次遍历矩阵,根据 row
和 col
数组中的标记将矩阵中的相应行和列置零。
算法步骤
-
初始化辅助数组:创建两个布尔类型的数组
row
和col
,分别用于标记哪些行和列需要被置为零。初始时,这两个数组的所有元素都设置为false
。 -
标记零元素的行和列:遍历矩阵的所有元素,如果某个元素
matrix[i][j]
为零,则将row[i]
和col[j]
设置为true
。 -
根据标记置零:再次遍历矩阵,如果元素所在的行
i
或列j
被标记为true
(即row[i]
或col[j]
为true
),则将matrix[i][j]
设置为零。
代码实现
class Solution {
public:
void setZeroes(vector<vector<int>>& matrix) {
int m = matrix.size(), n = matrix[0].size();
vector<bool> row(m, false), col(n, false);
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (matrix[i][j] == 0) {
row[i] = true;
col[j] = true;
}
}
}
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (row[i] || col[j]) {
matrix[i][j] = 0;
}
}
}
}
};