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 两个辅助数组。

相关推荐
小雉系统4 小时前
BcoreOS安全通信架构:FsSession 抗算法后门安全设计
算法·安全·架构
唐墨1238 小时前
linux kernel 比较数据大小的宏定义
linux·算法
拂拉氏9 小时前
【知识讲解-题目讲解】 统计满足K约束的子字符串数量2 (滑动窗口+前缀和+二分查找+分析)
算法·前缀和·二分查找·滑动窗口
通信小呆呆13 小时前
电子战抗干扰技术:当“不被干扰”成为一种系统
算法·通信·mimo·isac
笑容掩饰我的失落13 小时前
区块链从小白到精通(八):从零实现一个标准 ERC-20 代币(完整可运行代码)
算法·区块链·php·智能合约·哈希算法
Severus_black14 小时前
【C++初阶】Stack、Queue算法题大练兵!
c语言·c++·算法·stl
2601_9679791217 小时前
机器学习必修课:经典算法与Python实战
python·算法·机器学习·实战·课程
程序猿打工仔17 小时前
计算机基础(C语言)考编、专技岗
c语言·开发语言·算法
通信小呆呆17 小时前
电子战干扰技术:从“蛮力压制”到“精准欺骗”,再到“认知博弈”
算法·通信·isac