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 == matrix[0].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/
相关推荐
爱吃生蚝的于勒1 小时前
C语言内存函数
c语言·开发语言·数据结构·c++·学习·算法
小白学大数据3 小时前
Python爬虫开发中的分析与方案制定
开发语言·c++·爬虫·python
phoenix@Capricornus3 小时前
循环矩阵和BCCB矩阵与向量乘积的快速计算——矩阵向量乘积与频域乘积之间的转换
线性代数·矩阵
versatile_zpc5 小时前
C++初阶:类和对象(上)
开发语言·c++
小鱼仙官5 小时前
MFC IDC_STATIC控件嵌入一个DIALOG界面
c++·mfc
神仙别闹5 小时前
基本MFC类框架的俄罗斯方块游戏
c++·游戏·mfc
ChoSeitaku6 小时前
链表循环及差集相关算法题|判断循环双链表是否对称|两循环单链表合并成循环链表|使双向循环链表有序|单循环链表改双向循环链表|两链表的差集(C)
c语言·算法·链表
娅娅梨6 小时前
C++ 错题本--not found for architecture x86_64 问题
开发语言·c++
DdddJMs__1356 小时前
C语言 | Leetcode C语言题解之第557题反转字符串中的单词III
c语言·leetcode·题解
兵哥工控6 小时前
MFC工控项目实例二十九主对话框调用子对话框设定参数值
c++·mfc