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) \\

因为使用了 rowcol 两个辅助数组。

相关推荐
忍冬k2 小时前
DeepSeek harness安装指南
java·开发语言·数据结构·c++·算法
何以解忧,唯有..2 小时前
预订酒店问题
算法
No8g攻城狮3 小时前
【算法】什么是 DFS 与 BFS 及他们的区别
算法·深度优先·宽度优先
zww89491113 小时前
家政派单系统实战指南:从需求分析到智能调度算法落地
算法·需求分析
手写码匠3 小时前
华为云Flexus+DeepSeek征文|Dify 多 Agent 评测实战:用 DeepSeek-R1 当裁判,打造多智能体系统的自动化质量保障体系
人工智能·深度学习·算法·aigc
ZC跨境爬虫3 小时前
LeetCode 88. 合并两个有序数组(双指针详解 + Java Python 实现)
java·python·算法·leetcode
Nil2083 小时前
leetcode 238除了自身以外数组的乘积
数据结构·算法·leetcode
土司大王3 小时前
LeetCode hot100——最长连续序列
数据结构·算法·leetcode
caimouse3 小时前
ReactOS 图形系统分析(17):区域填充 — EngPaint / IntEngPaint(paint.c)
c语言·开发语言·算法