【刷题日记】73. 矩阵置零

简介: 【刷题日记】73. 矩阵置零

一、题目描述:

今天来做一个二维数组的题目,矩阵置零

image.png

二、这道题考察了什么思想?你的思路是什么?

题目对我们的要求很明确也很简单,需要我们根据条件,将题目给出的二维矩阵对应的位置修改为 0

条件是:

当原矩阵的的某个位置数字为 0 的时候,那么这个位置对应的一行,和一列全部都需要变成 0

分析

这个题目看的出来,相对比较简单,而且看完题目,相信我们很快就会有思路,可能不是最优解,范式至少我们能够第一时间想出解决的方式,例如

看到题目,就能很容易想到,既然需要在原矩阵上修改值,那么我们就不能每一步都读取原有矩阵来判断是否需要按照条件来将矩阵的行列变成 0 , 因此我们需要用一个相应的一维数组来标记一下某一行是否需要全 0,某一列是否需要全 0

例如示例二中:

image.png

我们就需要这样的两个一维数组来进行标记

标记行的数组 0 1 2
true false false
标记列的数组 0 1 2 3
true false false true

那么当我们遍历二维矩阵的时候,实际上去校验一下当前位置对应的行或者列是否需要全部为 0 ,若是,则将当前位置的数值赋值为 0 即可

其实到这里,我们本应就可以编码了,但是我们继续看题,题目需要我们用更小的空间复杂度来解决这个题,因为本次我们第一时间想到的方式,空间复杂度是 O(m+n),其中 m 为行数组,n 为列数组的空间

进阶

那我们就要办法优化一下空间复杂度,既然上述我们是用了两个一维数组来进行标记,那么我们为了降低时间复杂度,是否可以用两个变量来标记呢?思考思考

还是以示例 2 为例:

image.png

  1. 我们遍历二维矩阵,记录一下当前矩阵的第一行,第一列是否需要为 0 ,记录为 row0 和 col0,很明显,该示例的记录结果为
row0 true
col0 true
  1. 我们开始遍历二维矩阵,判断当前位置是否为 0 ,若为零,则将原二维矩阵对应的第 0 行,和第0 列对应的位置赋值为 0 ,例如得到如下结果,发现对于本案例没啥变化,这一步主要是为了给我们的第0 行 和第 0 列进行赋值的
0 1 2 0
3 4 5 2
1 3 1 5
  1. 再遍历一次二维矩阵,这个时候,我们校验的是,当前的位置对应的第 0 行,和第0 列对应的位置是否为 0 ,若是,则将当前位置赋值为 0,得到如下结果
0 1 2 0
3 4 5 0
1 3 1 0
  1. 判断 row0 ,和 col0 是否为 true,若是,则将第 0 行 或者第0 列全部赋值为 0,这个是表示最开始原矩阵中就需要将第 0 行或的第 0 列全部赋值为 0 ,放在现在才做,是为了不影响前面步骤的进行, 得到如下结果
0 0 0 0
0 4 5 0
0 3 1 0

看到这里,xdm 应该看明白了这种方式了,我们只引入了常数级别的空间消耗,满足题目的进阶要求,一起来撸代码吧

三、编码

根据上述逻辑和分析,我们就可以翻译成如下代码

  • 严格按照上述分析的步骤来,不能跳步骤,直接翻译成代码即可

编码如下:

func setZeroes(matrix [][]int)  {
    // 先初始化我们的行列标记,标记第一行和第一列是否有 0
    n, m := len(matrix), len(matrix[0])
    row0, col0 := false, false
     for _, v := range matrix[0] {
        if v == 0 {
            row0 = true
            break
        }
    }
    for _, r := range matrix {
        if r[0] == 0 {
            col0 = true
            break
        }
    }
    // 开始正式遍历二维矩阵,查看当前数字是否为 0, 若为 0 ,则把当前位置对应第 0 行 和第 0 列 赋值为 0
     for i := 1; i < n; i++ {
        for j := 1; j < m; j++ {
            if matrix[i][j] == 0 {
                matrix[i][0] = 0
                matrix[0][j] = 0
            }
        }
    }
    // 再遍历 1 次二维矩阵,校验到当前位置对应的第 0 行,或者第 0 列是 0 ,则当前位置直接赋值为 0
    for i := 1; i < n; i++ {
        for j := 1; j < m; j++ {
            if matrix[i][0] == 0 || matrix[0][j] == 0 {
                matrix[i][j] = 0
            }
        }
    }
    // 最后,我们确认一下最开始我们校验的第 0 行 和 第 0 列是不是一开始就是有 0,若有,则这一行,或者这一列都是赋值为 0
    if row0 {
        for j := 0; j < m; j++ {
            matrix[0][j] = 0
        }
    }
    if col0 {
        for _, r := range matrix {
            r[0] = 0
        }
    }
}

四、总结:

image.png

本次解法文章内容中也有说到,空间复杂度是 O(1) ,这个就不过多说明, 时间复杂度也是很明确的,我们最多就是遍历了二维矩阵,因此时间复杂度是 O(mn) ,m 为行,n 为列

原题地址:73. 矩阵置零

欢迎点赞,关注,收藏

朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力

image.png

好了,本次就到这里

技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。

我是阿兵云原生,欢迎点赞关注收藏,下次见~

相关文章
|
安全 应用服务中间件 网络安全
[网络安全]upload-labs Pass-06 解题详析
[网络安全]upload-labs Pass-06 解题详析
200 0
|
算法 开发工具 git
时间紧任务急,如何在LeetCode刷题
很多公司都会面试算法题,然而很多小伙伴平时工作很忙,没有时间或没有养成刷题的习惯,面试准备周期时间也很紧张,没办法刷完LeetCode,往往慌慌张张刷了一些题,然而其实效果也不好。 当然这里还是建议大家平时多看看算法题,毕竟程序=数据结构+算法,对你以后的编程工作来说是大有好处的。
时间紧任务急,如何在LeetCode刷题
|
4月前
|
人工智能 自然语言处理 安全
AI尝鲜:dify搭建AI对话机器人
本实验介绍如何在Dify中设置知识库并创建智能应用作为对话机器人,实现AI对话功能。例如查询电动汽车电池过充电保护试验的环境温度条件。实验步骤包括:一、安装Dify并通过计算巢部署;二、设置模型供应商,选择通义千问并配置API KEY;三、创建知识库,导入文件并设置文本分段与清洗规则;四、创建智能体,添加知识库和模型;五、与智能体对话,测试查询功能。通过这些步骤,您可以构建一个基于专有知识库的AI对话系统。
|
设计模式 算法 安全
【C/C++ 关键字 函数说明符 】C++ final关键字(修饰成员函数无法被子类重写覆盖)
【C/C++ 关键字 函数说明符 】C++ final关键字(修饰成员函数无法被子类重写覆盖)
444 1
|
11月前
|
安全 数据安全/隐私保护 开发者
保护敏感数据:使用Python加密数据的实用方法
保护敏感数据是一项基本的安全实践,Python通过上述库提供了强大的加密工具来实现这一目标。选择哪种方法取决于具体的应用场景和安全需求:对称加密(如AES)适合快速处理大量数据,而非对称加密(如RSA)更适合安全地交换密钥或进行身份验证。哈希函数则用于验证数据的完整性和一致性。通过合理使用这些技术,开发者可以大大增强其应用程序的安全性。
317 0
|
11月前
|
自然语言处理 编译器 C语言
软考:区分词法分析、语法分析、语义分析
本文解释了编译过程中的词法分析、语法分析和语义分析三个阶段的区别,并提供了相关练习题,帮助读者理解各阶段在编译过程中的作用和重要性。
554 4
|
Unix Linux
【Linux】详解信号的分类&&如何自定义信号的作用
【Linux】详解信号的分类&&如何自定义信号的作用
176 1
|
Python
在Python的pandas库中,向DataFrame添加新列简单易行
【6月更文挑战第15天】在Python的pandas库中,向DataFrame添加新列简单易行。可通过直接赋值、使用Series或apply方法实现。例如,直接赋值可将列表或Series对象分配给新列;使用Series可基于现有列计算生成新列;apply方法则允许应用自定义函数到每一行或列来创建新列。
919 8
Linux磁盘配额
在Linux系统中,当用户的空间占用接近或超过预设的软限制时,系统会警告用户磁盘空间将满。软限制是允许用户使用的磁盘空间的最大值,在此限制下,用户仍有宽限期来减少空间使用。如果在宽限期内用户未减少空间占用,达到硬限制,软限制将升级为硬限制。硬限制是用户可以使用的绝对最大值。默认的宽限期是7天,如果超过这个期限,用户的空间限制会立即降低到硬限制。
|
数据采集 Oracle 关系型数据库
Oracle系列之十:Oracle正则表达式
Oracle系列之十:Oracle正则表达式