[矩阵置零]

初始思路分析

这段代码实现了将矩阵中元素为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;
            }
        }
    }
};