LeetCode 力扣 热题 100道(二十八)矩阵置零(C++)

给定一个 mxn 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法**。**

cpp 复制代码
class Solution {
public:
    void setZeroes(vector<vector<int>>& matrix) {
        int m = matrix.size();
        int n = matrix[0].size();
        
        // 标记第一行和第一列是否需要置零
        bool firstRowZero = false, firstColZero = false;
        
        // 检查第一列是否有零
        for (int i = 0; i < m; ++i) {
            if (matrix[i][0] == 0) {
                firstColZero = true;
                break;
            }
        }
        
        // 检查第一行是否有零
        for (int j = 0; j < n; ++j) {
            if (matrix[0][j] == 0) {
                firstRowZero = true;
                break;
            }
        }
        
        // 用第一行和第一列作为标记
        for (int i = 1; i < m; ++i) {
            for (int j = 1; j < n; ++j) {
                if (matrix[i][j] == 0) {
                    matrix[i][0] = 0;
                    matrix[0][j] = 0;
                }
            }
        }
        
        // 根据标记置零
        for (int i = 1; i < m; ++i) {
            for (int j = 1; j < n; ++j) {
                if (matrix[i][0] == 0 || matrix[0][j] == 0) {
                    matrix[i][j] = 0;
                }
            }
        }
        
        // 处理第一列
        if (firstColZero) {
            for (int i = 0; i < m; ++i) {
                matrix[i][0] = 0;
            }
        }
        
        // 处理第一行
        if (firstRowZero) {
            for (int j = 0; j < n; ++j) {
                matrix[0][j] = 0;
            }
        }
    }
};

标记需要置零的行和列:

我们不能直接修改矩阵,因为这样会影响后续的判断。因此,我们可以利用矩阵的第一行和第一列作为标记,用来记录哪些行和列需要置零。

具体步骤:

遍历矩阵,找到为零的元素,将对应的行和列的第一个元素置为零(即标记)。

再次遍历矩阵,使用标记的信息将对应的行和列置为零。

需要额外的变量来记录第一行和第一列是否需要置零,因为这两个被用作标记列。

时间复杂度和空间复杂度:

时间复杂度:O(m * n),需要遍历两次矩阵。

空间复杂度:O(1),只使用了常数额外空间。

相关推荐
花椒技术8 分钟前
2.46 秒生成 5 秒视频:拆解 H3 Max 的模型、推理栈与硬件协同
算法·音视频开发·视频编码
vivo互联网技术15 分钟前
ART:妆容迁移框架,重新定义高保真妆容迁移 | ECCV 2026
人工智能·算法·图像识别
用户04414409244918 分钟前
卫星信号模拟器里的四个坐标转换公式
算法
橘和柠28 分钟前
阿里 open-code-review (AI代码审查工具)实战:安装、四层规则链、自定义规则格式与实测避坑
算法·面试
得物技术28 分钟前
别再只卷向量检索了,得物交易搜索如何用“生成式”实现召回范式跃迁?
人工智能·算法·llm
罗西的思考28 分钟前
[Agent Memory / 强化学习] MemPO源码学习笔记 ---(4)--- Rollout实现细节
人工智能·算法
罗西的思考39 分钟前
机器人 / 物理 Agent Harness 综合分析与对比:从「更强的模型」到「更好的系统」
人工智能·算法·机器学习
小小龙学IT39 分钟前
Boost.Interprocess 开源 C++ 进程间通信库深度解析
c++·开源
库玛西40 分钟前
攻克 408 数据结构:图论基石深度拆解(数学极值推演 + 存储内存剖析 + BFS/DFS 双核模板)
数据结构·算法·深度优先·广度优先·图搜索算法
晓蛋5 天前
c语言指的是什么意思
c语言·编译器·编程开发·集成开发环境·程序实例