leetcode73. 矩阵置零,简单模拟

leetcode73. 矩阵置零

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

示例 1:

输入:matrix = \[1,1,1,1,0,1,1,1,1]

输出:\[1,0,1,0,0,0,1,0,1]

示例 2:

输入:matrix = \[0,1,2,0,3,4,5,2,1,3,1,5]

输出:\[0,0,0,0,0,4,5,0,0,3,1,0]

提示:

m == matrix.length

n == matrix0.length

1

目录

题目分析

给定一个二维数组 matrix,其中每个元素 matrix[i][j] 代表矩阵中的一个整数。要求将所有值为0的元素所在的行和列都置为0。

算法步骤

  1. 初始化两个布尔变量 frfc,分别用于标记第一行和第一列是否需要置0。
  2. 遍历第一行和第一列,记录哪些位置的元素为0。
  3. 遍历矩阵中的其他元素,如果遇到0,则将所在行和列的第一个元素置为0。
  4. 再次遍历矩阵,将所有第一个元素为0的行和列中的其他元素也置为0。
  5. 最后,如果第一行或第一列需要置0,则将整个行或列置为0。

算法流程

初始化fr和fc 遍历第一行 遍历第一列 遍历矩阵其他元素 再次遍历矩阵 最后处理第一行或第一列 结束

第一行的处理

  • 原因:如果第一行中的某个元素在初始时为0,但在后续的遍历中被赋值为非0,那么在处理其他行时,由于第一行已经标记为需要置0,会导致其他行中本不需要置0的元素被错误地置为0。
  • 处理方法:在开始遍历之前,先判断第一行中是否有元素为0,如果有,则将其标记为需要置0。

第一列的处理

  • 原因:同理,如果第一列中的某个元素在初始时为0,但在后续的遍历中被赋值为非0,那么在处理其他列时,由于第一列已经标记为需要置0,会导致其他列中本不需要置0的元素被错误地置为0。
  • 处理方法:在开始遍历之前,先判断第一列中是否有元素为0,如果有,则将其标记为需要置0。

具体代码

cpp 复制代码
class Solution {
public:
    void setZeroes(vector<vector<int>>& matrix) {
    int m=matrix.size();
    int n=matrix[0].size();
    bool fr=false;
    bool fc=false;
    //判断第一行要不要置0
    for(int i=0;i<n;i++)
    {
        if(matrix[0][i]==0) fr=true;
    }
    for(int i=0;i<m;i++)
    {
        if(matrix[i][0]==0) fc=true;
    }
    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(fr) 
    {
        for(int i=0;i<n;i++) matrix[0][i]=0;

    }
    if(fc)
    {
        for(int i=0;i<m;i++) matrix[i][0]=0;
    }
    }
};

算法分析

  • 时间复杂度 : O(m*n),其中 m 是矩阵的行数,n 是矩阵的列数。
  • 空间复杂度: O(1),只使用了常数级别的额外空间。
  • 易错点: 在处理第一行和第一列时,需要特别注意不要影响之后的遍历。

相似题目

题目 链接
189. 旋转数组 https://leetcode.cn/problems/rotate-array/
200. 岛屿数量 https://leetcode.cn/problems/number-of-islands/
207. 课程表 https://leetcode.cn/problems/course-schedule/
相关推荐
swipe4 分钟前
Mem0 x Agent 实战系列:分层记忆 + 三路召回,搭建真正可用的长期记忆层
前端·javascript·面试
Lee川12 分钟前
Event Loop 面试通关:从原理到口述再到实战
前端·面试
happymaker062632 分钟前
LeetCodeHot100——42.接雨水
算法
kyriewen33 分钟前
手写 call、apply、bind:从原理到实现,附 3 个最容易忽略的边界情况
前端·javascript·面试
胡萝卜术41 分钟前
从内存视角重新认识 JavaScript 数据类型:一份深度学习笔记
前端·javascript·面试
Waay1 小时前
K8s ETCD 详解|备份恢复+静态Pod原理+kubectl查询底层流程(面试必考)
面试·kubernetes·etcd
阿正的梦工坊1 小时前
【Rust】07-错误处理:Option、Result 与 ? 运算符
开发语言·算法·rust
烬羽1 小时前
从零理解树与二叉树:用 JS 带你手撕遍历和递归
javascript·数据结构
程序员二叉1 小时前
【JVM】OOM详解+JVM参数+FullGC排查+CPU飙高+死锁+内存泄漏+命令大全
java·开发语言·jvm·面试
YHL1 小时前
🚀从零理解树与二叉树 —— 概念、实现与遍历
前端·javascript·数据结构