leetcode 73矩阵置0

cpp 复制代码
class Solution {
public:
    void setZeroes(vector<vector<int>>& matrix) {
        int m = matrix.size();  //行数
        int n = matrix[0].size(); //列数
        vector<int>row(m),col(n);
        for(int i = 0;i<m;i++){
            for(int j = 0;j<n;j++){
                if(matrix[i][j] == 0){
                    row[i] = col[j] = 1;
                }
            }
        }
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                if(row[i]==1 || col[j]==1){
                    matrix[i][j]=0;
                }
            }
        }
    }
};

这段代码解决的是"矩阵置零"问题:只要某个位置原本是 0,就把它所在的整行和整列全部变成 0。

比如:

复制代码
matrix = {
    {1, 1, 1},
    {1, 0, 1},
    {1, 1, 1}
};

中间的 matrix[1][1] = 0,所以第 1 行和第 1 列都要置零,最后变成:

复制代码
{
    {1, 0, 1},
    {0, 0, 0},
    {1, 0, 1}
}

代码先获取矩阵的行数和列数:

复制代码
int m = matrix.size();      // 行数
int n = matrix[0].size();   // 列数

然后创建两个辅助数组:

复制代码
vector<int> row(m), col(n);

它们初始都是 0。可以理解为:

复制代码
row[i] = 1  → 第 i 行需要全部置零
col[j] = 1  → 第 j 列需要全部置零

接着第一次遍历矩阵:

复制代码
for(int i = 0; i < m; i++){
    for(int j = 0; j < n; j++){
        if(matrix[i][j] == 0){
            row[i] = col[j] = 1;
        }
    }
}

如果发现:

复制代码
matrix[i][j] == 0

那么就记录:

复制代码
row[i] = 1;
col[j] = 1;

例如:

复制代码
matrix[1][1] == 0;

那么:

复制代码
row = [0,1,0]
col = [0,1,0]

表示:

复制代码
第 1 行需要变成 0
第 1 列需要变成 0

然后第二次遍历:

复制代码
for(int i = 0; i < m; i++){
    for(int j = 0; j < n; j++){
        if(row[i] == 1 || col[j] == 1){
            matrix[i][j] = 0;
        }
    }
}

只要当前位置满足:

复制代码
row[i] == 1

说明这一整行应该置零;

或者:

复制代码
col[j] == 1

说明这一整列应该置零。

因此:

复制代码
if(row[i] == 1 || col[j] == 1)

使用的是 ||,也就是**"行需要置零或者列需要置零,只要满足一个条件就置零。"**

你可以把整道题直接记成:

第一遍不修改矩阵,只记录哪些行、哪些列出现了 0;第二遍根据记录,把对应行和列全部置 0。

这里之所以不能第一遍发现 0 就直接把整行整列改成 0,是因为新改出来的 0 会影响后续判断。例如原来:

复制代码
1 1 1
1 0 1
1 1 1

如果边遍历边改,可能把"后来产生的 0"误认为是"原来就存在的 0",导致更多行列错误地被置零。

所以这个算法最关键的思想就是:

先记录,再修改。

时间复杂度是:

\ O(mn) \\

因为矩阵遍历了两遍;额外空间是:

\ O(m+n) \\

因为使用了 row 和 col 两个辅助数组。

相关推荐
徐小夕10 小时前
花了3个月,我们做了一款 AI 版的“飞书文档”
前端·算法·github
Robert--cao10 小时前
移动底盘与机械臂联合规划:开源算法与工程实现
算法
小豆庄11 小时前
Mac 上给视频人脸打码:本地工具的依赖、追踪与推理管线
算法·视觉检测·视频·敏捷流程·纹理贴图
星夜离尘5612 小时前
MATLAB 工程实验:从相邻块均值手写重叠 Allan 偏差,数清有效项
算法·matlab·均值算法
y1su14 小时前
Leetcode 字符串模板
java·数据结构·算法·leetcode·职场和发展·动态规划
residual_fan14 小时前
船用柴油机动态机动工况故障诊断:控制感知仿射网络(CAAN)的技术实现
人工智能·算法·数据挖掘·数据分析
其实防守也摸鱼15 小时前
Cylab在线靶场——CTF中的通用技能
linux·数据库·学习·算法·靶场·ctf·学习网络安全
蓝悦无人机15 小时前
《Planning algorithms》读书笔记——第8章 反馈运动规划
算法·读书笔记·反馈运动规划
RaaS10015 小时前
Agent Skills 进了 Linux Foundation:2.8 亿次安装,但装 skill 还没有安全规范
人工智能·算法·架构
CV爱数码15 小时前
CT 重建从零开始(五):ASTRA Toolbox 上手——几何、投影器与算法
图像处理·算法·计算机视觉·ct