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

相关推荐
ZhengEnCi18 分钟前
Agent 架构怎么选:从单 Agent 到多 Agent 编排的选型决策指南
算法·架构
秋天的怀念_David1 小时前
第二十二夜 · 数字迷雾
java·程序人生·算法
Pniubi1 小时前
力扣283移动零(双指针法)
算法·leetcode·职场和发展
hhb_6181 小时前
大模型落地三重优化实战
人工智能·算法·机器学习
云和数据.ChenGuang2 小时前
光哥说Python RAG 系统需要哪些评估指标:从检索到生成的全链路评测指南
网络·人工智能·python·算法·langchain
2601_970703833 小时前
工业除湿机租赁:把一份租金合同拆开看
大数据·数据结构·算法·数据库架构·推荐算法
心中有你02143 小时前
Java实现Dijkstra最短路径算法(邻接表 + 优先队列)
java·数据库·算法
ZhengEnCi4 小时前
同样的模型,为什么本地和云 API 差别那么大:量化精度、聊天模板与采样参数的三大元凶
人工智能·算法·llm
Flynn Liang4 小时前
RAG 答非所问/幻觉怎么破?Spring AI QuestionAnswerAdvisor 召回优化实战(TopK/重排/混合检索)
人工智能·算法·spring·rag·幻觉·springai
liminla!5 小时前
SQL 从入门到进阶:语法速查与实战练习(完整优化版)
数据库·sql·算法