[矩阵置零]
初始思路分析
这段代码实现了将矩阵中元素为0的行和列全部置零的功能。主要思路是使用标记数组记录需要置零的行和列。以下是详细分析:
1. 初始化阶段
int m = matrix.size();
int n = matrix[0].size();
vector<bool> row(m), col(n);
- 获取矩阵的行数
m
和列数n
- 创建两个布尔数组:
row
数组标记哪些行需要置零(长度=m)col
数组标记哪些列需要置零(长度=n)
2. 第一次遍历:标记阶段
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. 第二次遍历:置零阶段
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
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;}}}
};