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

相关推荐
阿贵---2 小时前
C++构建缓存加速
开发语言·c++·算法
Queenie_Charlie2 小时前
最长回文子串 V2(Manacher算法)
c++·算法·manacher算法
Evand J2 小时前
【MATLAB复现RRT(快速随机树)算法】用于二维平面上的无人车路径规划与避障,含性能分析与可视化
算法·matlab·平面·无人车·rrt·避障
一招定胜负2 小时前
机器学习+深度学习经典算法面试复习指南
深度学习·算法·机器学习
皮卡狮2 小时前
高阶数据结构:AVL树
数据结构·算法
天若有情6733 小时前
通用个性化推荐核心架构思路:从视频到电商的跨场景落地实践
人工智能·算法·架构·推流·个性化推荐·猜你喜欢
s09071363 小时前
【声纳成像】基于滑动子孔径与加权拼接的条带式多子阵SAS连续成像(MATLAB仿真)
开发语言·算法·matlab·合成孔径声呐·后向投影算法·条带拼接
jay神3 小时前
基于YOLOv8的钢材表面缺陷检测系统
人工智能·算法·yolo·目标检测·计算机视觉
Accerlator3 小时前
2026年3月21日刷题
算法