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. 初始化两个布尔变量 fr 和 fc,分别用于标记第一行和第一列是否需要置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/
相关推荐
文丑颜不良啊11 分钟前
LeetCode2921~2940题目解析
java·leetcode
Pniubi29 分钟前
动态规划入门 ( - 力扣509斐波那契数)
算法·动态规划
吴长建先生重名了2 小时前
GitHub Actions部署报表系统踩坑记:幂等性与限
算法
贝壳6902 小时前
一个2026年2月才上传的库,凭什么敢碰2009年就有人写烂的题目
算法
文丑颜不良啊2 小时前
LeetCode2901~2920题目解析
java·leetcode
贝壳6903 小时前
同一道三亿位选型题,三个AI给了我三个答案,我把它们拉进同一台机器复跑
算法
Yuzhiyuxia3 小时前
【AI Agent面试系列】AI Agent实战设计
人工智能·面试·职场和发展
汉克老师4 小时前
《从C++小白到算法高手:GESP 1—8级成长地图》第一讲:认识GESP——从编程新手到算法探索者
c++·gesp·信息学竞赛·小学生学c++
时间的拾荒人4 小时前
Redis 哨兵(Sentinel)详解:原理、选举机制与实战部署
redis·面试·架构·sentinel
nice_lcj5204 小时前
MySQL 存储引擎入门:InnoDB 和 MyISAM 到底怎么选
java·数据库·mysql·面试·innodb·存储引擎·myisam