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:要填充的值

相关推荐
漂流瓶jz41 分钟前
UVA-1442 洞穴 题解答案代码 算法竞赛入门经典第二版
c++·算法·题解·aoapc·算法竞赛入门经典·uva
叠层归一研究院2 小时前
基于极限自指的叠层归一宇宙结构理论——无元外部封闭系统的内生区分模型
人工智能·经验分享·算法·agi
Selvaggia3 小时前
Diffusion Model 的基本原理与模型架构
算法
wabs6664 小时前
关于二叉树【力扣572.另一棵树的子树的思考】
数据结构·c++·算法·leetcode·二叉树
hanlin034 小时前
刷题笔记:力扣第41题-缺失的第一个正数
笔记·算法·leetcode
shehuiyuelaiyuehao5 小时前
算法50,分治归并,数组中的逆序对
java·算法
阳明山水5 小时前
校准分位数驱动智能库存决策
人工智能·深度学习·算法·机器学习·架构
别动我齐刘海7 小时前
ROS2 Jazzy + C++ 实战路线——进阶学习3
c++·人工智能·vscode·python·算法·机器学习·机器人
zhangfeng11337 小时前
《从“人工适配“到“智能生成“:KernelSwift 跨国产芯片算子迁移全栈方案解读》 —— 强调范式跃迁和跨硬件属性,适合偏架构分析的写法
人工智能·算法·华为·ai编程·npu
0+1117 小时前
算法 --滑动窗口
c++·算法·leetcode