LeetCode hot100-73 矩阵置零

复制代码
class Solution {
public:
    void setZeroes(vector<vector<int>>& matrix) {
        unordered_set<int> m;
        unordered_set<int> n;
        for(int i=0;i<matrix.size();++i)
        {
            for(int j=0;j<matrix[0].size();++j)
            {
                if(matrix[i][j]==0){
                    m.insert(i);
                    n.insert(j);
                }
            }
        }

        for(int i=0;i<matrix.size();++i){
            for(int j=0;j<matrix[0].size();++j){
                if(m.contains(i)){
                    matrix[i][j]=0;
                }
                else{
                    if(n.contains(j)){
                        matrix[i][j]=0;
                    }
                }
            }
        }

    }
};

class Solution {
public:
    void setZeroes(vector<vector<int>>& matrix) {
        int m = matrix.size(), n = matrix[0].size();
        bool first_row_has_zero = ranges::contains(matrix[0], 0); // 记录第一行是否包含 0
        bool first_col_has_zero = ranges::any_of(matrix, [](auto& row) { return row[0] == 0; }); // 记录第一列是否包含 0

        // 用第一列 matrix[i][0] 保存 row_has_zero[i]
        // 用第一行 matrix[0][j] 保存 col_has_zero[j]
        for (int i = 1; i < m; i++) { // 无需遍历第一行,如果 matrix[0][j] 本身是 0,那么相当于 col_has_zero[j] 已经是 true
            for (int j = 1; j < n; j++) { // 无需遍历第一列,如果 matrix[i][0] 本身是 0,那么相当于 row_has_zero[i] 已经是 true
                if (matrix[i][j] == 0) {
                    matrix[i][0] = 0; // 相当于 row_has_zero[i] = true
                    matrix[0][j] = 0; // 相当于 col_has_zero[j] = true
                }
            }
        }

        for (int i = 1; i < m; i++) { // 跳过第一行,留到最后修改
            for (int j = 1; j < n; j++) { // 跳过第一列,留到最后修改
                if (matrix[i][0] == 0 || matrix[0][j] == 0) { // i 行或 j 列有 0
                    matrix[i][j] = 0;
                }
            }
        }

        // 如果第一列一开始就包含 0,那么把第一列全变成 0
        if (first_col_has_zero) {
            for (auto& row : matrix) {
                row[0] = 0;
            }
        }

        // 如果第一行一开始就包含 0,那么把第一行全变成 0
        if (first_row_has_zero) {
            ranges::fill(matrix[0], 0);
        }
    }
};
复制代码
bool first_row_has_zero = ranges::contains(matrix[0], 0);
  • ranges::contains:C++20 引入的 ranges 算法,用于判断容器中是否包含某个值

  • matrix[0]:二维矩阵的第一行

  • 0:要查找的目标值

  • 返回值bool 类型,找到返回 true,否则返回 false

| 算法 | 含义 | 返回条件 |
| ranges::any_of | 至少一个满足 | 有一个 true 就返回 true |
| ranges::all_of | 所有都满足 | 所有都是 true 才返回 true |

ranges::none_of 没有一个满足 所有都是 false 才返回 true
复制代码
bool first_col_has_zero = ranges::any_of(matrix, [](auto& row) { return row[0] == 0; });
  • ranges::any_of :判断范围内是否有至少一个元素满足条件

  • matrix:二维矩阵

  • [](auto& row) { return row[0] == 0; }:Lambda 表达式,检查每一行的第一个元素是否为 0

  • 返回值bool,只要有一行的第一列为 0,就返回 true

    // 检查第一列是否有0
    bool first_col_has_zero = std::ranges::any_of(matrix, [](auto& row) {
    return row[0] == 0;
    });

    // 检查是否有任何一行包含0
    bool any_row_has_zero = std::ranges::any_of(matrix, [](auto& row) {
    return std::ranges::contains(row, 0);
    });

    // 检查是否有任何元素大于5
    bool any_greater_than_5 = std::ranges::any_of(
    matrix | std::views::join, // 将二维数组展平
    [](int val) { return val > 5; }
    );

  • matrix :二维容器(如 vector<vector<int>>

  • |:管道操作符,将左侧的范围传递给右侧的视图适配器

  • std::views::join:将多个范围连接成一个范围

  • 结果 :一个一维视图,包含所有内层容器的所有元素

复制代码
 std::vector<std::vector<int>> matrix = {
        {1, 2, 3},
        {4, 5, 6},
        {7, 8, 9}
    };
    
    // 创建展平视图
    auto flat = matrix | std::views::join;
    
    // 遍历所有元素(一维顺序)
    for (int val : flat) {
        std::cout << val << " ";  // 输出: 1 2 3 4 5 6 7 8 9
    }
}
复制代码
ranges::fill(matrix[0], 0);
  • ranges::fill:范围填充算法,将指定范围内的所有元素设置为某个值

  • matrix[0] :二维矩阵的第一行(vector<int> 类型)

  • 0:要填充的值

相关推荐
生成论实验室23 分钟前
《事件关系阴阳博弈动力学:识势应势之道》第四篇:降U动力学——认知确定度的自驱演化
人工智能·科技·神经网络·算法·架构
AI科技星37 分钟前
全域数学·72分册:场计算机卷【乖乖数学】
算法·机器学习·数学建模·数据挖掘·量子计算
科研前沿1 小时前
镜像孪生VS视频孪生核心技术产品核心优势
大数据·人工智能·算法·重构·空间计算
水蓝烟雨2 小时前
1931. 用三种不同颜色为网格涂色
算法·leetcode
晨曦夜月2 小时前
map与unordered_map区别
算法·哈希算法
图码2 小时前
如何用多种方法判断字符串是否为回文?
开发语言·数据结构·c++·算法·阿里云·线性回归·数字雕刻
handler012 小时前
Linux 内核剖析:进程优先级、上下文切换与 O(1) 调度算法
linux·运维·c语言·开发语言·c++·笔记·算法
minglie13 小时前
实数列的常用递推模式
算法
代码小书生3 小时前
math,一个基础的 Python 库!
人工智能·python·算法
AI科技星3 小时前
全域数学·数术本源·高维代数卷(72分册)【乖乖数学】
人工智能·算法·数学建模·数据挖掘·量子计算