class Solution {
public:
void setZeroes(vector<vector<int>>& matrix) {
int m = matrix.size(); // 获取矩阵的行数
int n = matrix[0].size(); // 获取矩阵的列数
vector<int> row(m), col(n); // 创建两个向量用于记录需要置零的行和列
// 遍历整个矩阵
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (matrix[i][j] == 0) { // 如果当前元素是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; // 将该元素置为0
}
}
}
}
};
int m = matrix.size(); // 获取矩阵的行数
int n = matrix[0].size(); // 获取矩阵的列数
vector<int> row(m), col(n); // 创建两个向量用于记录需要置零的行和列
-
int m = matrix.size();
matrix.size()
返回的是矩阵的行数,因为matrix
是一个二维向量,每一个元素都是一个子向量。- 例如,对于上述
matrix
,matrix.size()
返回 3。
-
int n = matrix[0].size();
matrix[0].size()
返回的是矩阵的列数,因为matrix[0]
是矩阵的第一行,它是一个向量,包含矩阵的列数个元素。- 例如,对于上述
matrix
,matrix[0].size()
返回 3,因为第一行[1, 2, 3]
有 3 个元素。 -
vector<int> row(m), col(n);
- 作用: 创建两个向量
row
和col
。row(m)
: 大小为m
的向量,用于标记需要置零的行。col(n)
: 大小为n
的向量,用于标记需要置零的列。
- 初始化: 默认初始化为零(假)。这意味着开始时所有行和列都未标记为需要置零
-
if (!matrix[i][j]) { row[i] = col[j] = true; }
-
为什么用
true
- 在C++中,对于整数类型,非零值被视为逻辑真(
true
),而零值被视为逻辑假(false
)。具体来说在这段代码中,当
matrix[i][j]
的值为0
时,通过设置row[i]
和col[j]
为true
,标记了需要将第i
行和第j
列的所有元素置为0
。然后,在第二个嵌套循环中,遍历整个矩阵,对于每个元素(i, j)
: - 如果
row[i]
或col[j]
中任何一个为true
,就将matrix[i][j]
设置为0
。 -
这样,所有被标记过的行和列的元素都会被置为
0
,从而达到了将矩阵中包含0
的行和列全部置零的目的 -
-
for (int i = 0; i < m; ++i) { for (int j = 0; j < n; ++j) { if (row[i] || col[j]) { matrix[i][j] = 0; } } }
详细解释
-
外部循环
for (int i = 0; i < m; ++i)
:- 遍历每一行。
-
内部循环
for (int j = 0; j < n; ++j)
:- 遍历每一列。
-
if (row[i] || col[j])
:row[i] || col[j]
表示“或者”运算。- 如果第
i
行或第j
列被标记为true
(需要置零),则进入代码块。
-
matrix[i][j] = 0;
:- 将当前元素
matrix[i][j]
置为0
。
- 将当前元素
-
代码作用总结
-
第一部分: 标记需要置零的行和列。
- 遍历矩阵,找到所有为
0
的元素,标记其所在行和列。
- 遍历矩阵,找到所有为
-
第二部分: 根据标记将对应行和列的元素全部置为
0
。- 遍历矩阵,如果当前行或列需要置零,则将该位置的元素置为
0
。
- 遍历矩阵,如果当前行或列需要置零,则将该位置的元素置为
true
用于表示需要置零的行和列。- 使用
true
和false
是因为布尔类型最适合这种逻辑判断。 -
不等于和置零的作用
row[i] || col[j]
:- 判断当前行或列是否需要置零。
matrix[i][j] = 0;
:- 将满足条件的元素设为
0
。
- 将满足条件的元素设为
-
通过这些操作,最终会使原矩阵中所有与
0
相交的行和列的元素都被置为0
-