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/
相关推荐
葫三生13 分钟前
如何评价《论三生原理》在科技界的地位?
人工智能·算法·机器学习·数学建模·量子计算
pipip.17 分钟前
UDP————套接字socket
linux·网络·c++·网络协议·udp
拓端研究室2 小时前
视频讲解:门槛效应模型Threshold Effect分析数字金融指数与消费结构数据
前端·算法
随缘而动,随遇而安4 小时前
第八十八篇 大数据中的递归算法:从俄罗斯套娃到分布式计算的奇妙之旅
大数据·数据结构·算法
孞㐑¥5 小时前
Linux之Socket 编程 UDP
linux·服务器·c++·经验分享·笔记·网络协议·udp
IT古董5 小时前
【第二章:机器学习与神经网络概述】03.类算法理论与实践-(3)决策树分类器
神经网络·算法·机器学习
Alfred king7 小时前
面试150 生命游戏
leetcode·游戏·面试·数组
水木兰亭8 小时前
数据结构之——树及树的存储
数据结构·c++·学习·算法
Jess079 小时前
插入排序的简单介绍
数据结构·算法·排序算法
老一岁9 小时前
选择排序算法详解
数据结构·算法·排序算法