
初始思路分析
这段代码实现了将矩阵中元素为0的行和列全部置零的功能。主要思路是使用标记数组记录需要置零的行和列。以下是详细分析:
1. 初始化阶段
cpp
int m = matrix.size();
int n = matrix[0].size();
vector<bool> row(m), col(n);
- 获取矩阵的行数
m
和列数n
- 创建两个布尔数组:
row
数组标记哪些行需要置零(长度=m)col
数组标记哪些列需要置零(长度=n)
2. 第一次遍历:标记阶段
cpp
for(int i=0; i<m; i++) {
for(int j=0; j<n; j++) {
if(matrix[i][j] == 0)
row[i] = col[j] = true;
}
}
- 遍历矩阵的每个元素
- 当发现元素为0时:
- 标记该行
row[i] = true
- 标记该列
col[j] = true
- 标记该行
3. 第二次遍历:置零阶段
cpp
for(int i=0; i<m; i++) {
for(int j=0; j<n; j++) {
if(row[i] || col[j])
matrix[i][j] = 0;
}
}
- 再次遍历矩阵的每个元素
- 如果当前行被标记(
row[i]==true
)或当前列被标记(col[j]==true
) - 就将该元素置为0
cpp
class Solution {
public:
void setZeroes(vector<vector<int>>& matrix) {
int m=matrix.size();
int n=matrix[0].size();
vector<bool> row(m),col(n);
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
if(matrix[i][j]==0)
row[i]=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;
}
}
}
};