73. 矩阵置零(二维数组代码细节讲解)

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 是一个二维向量,每一个元素都是一个子向量。
    • 例如,对于上述 matrixmatrix.size() 返回 3。
  • int n = matrix[0].size();

    • matrix[0].size() 返回的是矩阵的列数,因为 matrix[0] 是矩阵的第一行,它是一个向量,包含矩阵的列数个元素。
    • 例如,对于上述 matrixmatrix[0].size() 返回 3,因为第一行 [1, 2, 3] 有 3 个元素。
    • vector<int> row(m), col(n);

    • 作用: 创建两个向量 rowcol
      • 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 用于表示需要置零的行和列。
      • 使用 truefalse 是因为布尔类型最适合这种逻辑判断。
      • 不等于和置零的作用

      • row[i] || col[j]
        • 判断当前行或列是否需要置零。
      • matrix[i][j] = 0;
        • 将满足条件的元素设为 0
      • 通过这些操作,最终会使原矩阵中所有与 0 相交的行和列的元素都被置为 0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值