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

相关推荐
ACM-moran3 小时前
条件显化(二分单峰函数+构造数列)
算法·推公式·整数三分
闻缺陷则喜何志丹3 小时前
【栈 运算系统】P3719 [AHOI2017初中组] rexp|普及+
c++·算法··洛谷·运算系统
疯狂打码的少年4 小时前
【数据库技术】多值依赖与第四范式(4NF)
数据库·笔记·算法
子文雨4 小时前
基于 uC3845 与 ATtiny13 双芯片架构的 8.4V/2.5Ah 锂电池智能充电器设计
单片机·嵌入式硬件·算法
青山木4 小时前
Hot 100 --- 数组中的第K个最大元素
java·数据结构·算法·排序算法
玛卡巴卡ldf4 小时前
【AICoding】笔试提示词设计思路
java·算法·ai编程
AI_yangxi4 小时前
口碑好的短视频矩阵系统
线性代数·矩阵
明月_清风4 小时前
位图与布隆过滤器:海量数据下的"存在性判断"艺术
前端·后端·算法
Rnan-prince4 小时前
堆与TopK · 从零到通透 —— 9 节全系列复盘
python·算法
明月_清风4 小时前
Hash 表从入门到精通:Go 实战与工程细节
前端·后端·算法