Leetcode 73. 矩阵置零

【力扣题解 Day 9】73. 矩阵置零 力扣算法打卡记录 阅读详情

题目

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

示例 1:
输入:

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

示例 2:

输入:
[
[0,1,2,0],
[3,4,5,2],
[1,3,1,5]
]
输出:
[
[0,0,0,0],
[0,4,5,0],
[0,3,1,0]
]

进阶:

  • 一个直接的解决方案是使用 O(mn) 的额外空间,但这并不是一个好的解决方案。
  • 一个简单的改进方案是使用 O(m + n) 的额外空间,但这仍然不是最好的解决方案。
  • 你能想出一个常数空间的解决方案吗?

解答

解法一:O(mn)额外空间

使用一个额外的二维数组记录每个 0 的索引下标 i,j
再次遍历,将对应的行,列清零。

代码
class Solution {
    public void setZeroes(int[][] matrix) {
        int m = matrix.length;
        int n = matrix[0].length;
        boolean[][] zeroIdxs = new boolean[m][n];
        
        for(int i = 0; i < m; i ++) {
            for(int j = 0; j < n; j ++) {
                if(matrix[i][j] == 0) {
                    zeroIdxs[i][j] = true;
                }
            }
        }
        
        for(int i = 0; i < m; i ++) {
            for(int j = 0; j < n; j ++) {
                if(zeroIdxs[i][j]) {
                    setZero(matrix, i, j);
                }
            }
        }
    }
    
    private void setZero(int[][] matrix, int row, int col) {
        for(int i = 0; i < matrix.length; i ++) {
            matrix[i][col] = 0;
        }
        
        for(int i = 0; i < matrix[0].length; i ++) {
            matrix[row][i] = 0;
        }
    }
}

结果

在这里插入图片描述

解法二:O(m + n)额外空间

原矩阵 0 下标在额外的空间记录的时候完全可以压缩。
只需要存储哪一行或那一列有 0 即可。

代码
class Solution {
    public void setZeroes(int[][] matrix) {
        int m = matrix.length;
        int n = matrix[0].length;
        boolean[] zeroIdxs = new boolean[m + n];
        
        for(int i = 0; i < m; i ++) {
            for(int j = 0; j < n; j ++) {
                if(matrix[i][j] == 0) {
                    zeroIdxs[i] = true;
                    zeroIdxs[m + j] = true;
                }
            }
        }
        
        for(int i = 0; i < m; i ++) {
            if(zeroIdxs[i]) {
                for(int j = 0; j < n; j ++) {
                    matrix[i][j] = 0;
                }
            }
        }
        
        for(int i = 0; i < n; i ++) {
            if(zeroIdxs[m + i]) {
                for(int j = 0; j < m; j ++) {
                    matrix[j][i] = 0;
                }
            }
        }
    }
}
结果

在这里插入图片描述

解法三:O(1)额外空间

利用第一行和第一列当作解法二中的存储行/列的数组。
具体内容在下述代码注释里。

代码
class Solution {
    public void setZeroes(int[][] matrix) {
        int m = matrix.length;
        int n = matrix[0].length;
        // 两个标志位,代表第一行或第一列是否需要清零
        boolean fr = false, fc = false; 
                
        // 设置 0 值所在的 i, j 索引值
        for(int i = 0; i < m; i ++) {
            for(int j = 0; j < n; j ++) {
                if(matrix[i][j] == 0) {
                    matrix[i][0] = 0;
                    matrix[0][j] = 0;
                    // 如果第一行或第一列有零值要特殊标记
                    if(i == 0) fr = true;
                    if(j == 0) fc = true;
                }
            }
        }
        
        // 将对应的行列清零,注意暂时不处理第一行和第一列
        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;
            }
        }
    }
}

结果

在这里插入图片描述

Leetcode 73:矩阵置零(最详细的解法!!!) 给定一个 m x n 的矩阵,如果一个元素为 0,则将其所在行和列的所有元素都设为 0。请使用原地算法**。** 示例 1: 输入: [ [1,1,1], [1,0,1], [1,1,1] ] 输出: [ [1,0,1], [0,0,0], [1,0,1] ] 示例 2: 输入: [ [0,1,2,0], [3,4,5,2], [1,3,1,5] ] 输... 阅读详情

相关推荐

【中等】力扣算法题解析LeetCode73:矩阵置零

本文介绍了一种原地算法,用于将矩阵中零元素所在的行和列全部置零。通过复用矩阵的首行和首列作为标记空间,结合两个额外变量记录首行首列自身的零元素状态,实现了O(1)空间复杂度。算法分为标记阶段和置零阶段:先标记需要置零的行列,再根据标记进行置零操作,最后处理首行首列。这种方法避免了标记覆盖问题,确保了正确性。代码实现展示了详细的处理逻辑,时间复杂度为O(mn),空间复杂度为O(1)。

ylumwd的博客 986

LeetCode 73.矩阵置零【c++】

一、题目 给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 进阶: 一个直观的解决方案是使用 O(mn) 的额外空间,但这并不是一个好的解决方案。 一个简单的改进方案是使用 O(m + n) 的额外空间,但这仍然不是最好的解决方案。 你能想出一个仅使用常量空间的解决方案吗? 二、解题思路 方法一: 先标记出矩阵中为0的元素所在的行和列,之后再对矩阵进行遍历,使标记的行和列的元素均为0。 方法二: 先将原矩阵进行复制,对新矩阵进行遍历,得到0

qq_52111135的博客 1152

微信小程序反编译实战:用wxappUnpacker获取他人源码的完整流程(附常见报错解决方案)

本文详细解析了微信小程序反编译的完整流程,从缓存提取到源码重构,使用wxappUnpacker工具链实现逆向工程。涵盖环境配置、解密反编译、项目调试等关键步骤,并提供了常见报错解决方案,帮助开发者学习优秀实现方案或进行安全审计。

weixin_42706667的博客 469

LeetCode高频题73. 矩阵置零

1)用辅助空间势必耗费额外空间 2)这种记录要变0或者1的事,可以原地记录,简单几个变量就行 3)笔试求AC,可以不考虑空间复杂度,但是面试既要考虑时间复杂度最优,也要考虑空间复杂度最优。...

weixin_46838716的博客 639

真双口RAM---Quartus与Vivado开发环境区别对比

2、写和写冲突:表示两个端口写使能同时有效且写地址相同,此时需要关断一个写,把两个写端口都需要更新的值处理到一个写端口上面,任何的DP RAM 都不支持写和写冲突。以上述直方图统计使用为例,博主在仿真过程中发现,vivado真双口RAM--B端口读写延迟2个clk;1、读和写冲突:如果读和写同时有效,且读和写是同一个地址时,发生RAM读写冲突,此时会把最新的写数据直接赋给读数据,称为写穿通到读。

weixin_54470733的博客 3582

如何编写 Skill 实现自动化用例生成

Skill 本质上是一组结构化的指令和工具定义,它告诉 AI 模型在特定场景下应该遵循什么流程、调用哪些工具、输出什么格式的内容。元信息:名称、描述、版本等。指令(Instructions):定义 AI 的行为准则和任务流程。工具(Tools):AI 可以调用的外部能力,如文件读写、代码执行、API 请求等。上下文(Context):预设的输入输出格式或示例。编写一个用于自动生成测试用例的 Skill,核心在于定义清晰的指令流程和输出规范。

Cesare的博客 2690

二维数组5:矩阵置零的三种解法

leetcode73,给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。 进阶: 一个直观的解决方案是使用 O(mn) 的额外空间,但这并不是一个好的解决方案。 一个简单的改进方案是使用 O(m + n) 的额外空间,但这仍然不是最好的解决方案。 你能想出一个仅使用常量空间的解决方案吗? 输入:matrix = [[1,1,1],[1,0,1],[1,1,1]]输出:[[1,0,1],[0,0,0],[1,0,1]] 输入:matrix ..

纵横千里 捭阖四方 的专栏 1839

Arduino——GY39大气压、温湿度、光照模块

前几天买东西的时候买了一个GY39,这个模块集成了温湿度,大气压,海拔,光照一体,使用起来很方面。它有两种工作模式使用串口模式时需要搭配转接板,我选择了IIC模式,看一下通信协议吧,就是关于高八位和低八位的数据。看一下接线。

戚晨夕的博客 2604

LeetCode矩阵置零

给定一个mxn的矩阵,如果一个元素为0,则将其所在行和列的所有元素都设为0。请使用原地算法。示例1输入matrix=[[1,1,1],[1,0,1],[1,1,1]]输出示例2输入输出。

qq_54426859的博客 495

ERDAS 2022与ArcGIS共存安装教程:如何避免端口冲突(详细配置步骤)

本文提供了一份详细的ERDAS 2022与ArcGIS共存安装教程,核心在于解决两者因FlexNet许可证服务器导致的端口冲突问题。通过分步指导,包括检查现有端口占用、修改ERDAS许可证文件端口号、配置防火墙及客户端设置,确保两款专业GIS与遥感软件能在同一系统上稳定运行。

weixin_29279047的博客 253

leetcode134 加油站

题目如下 在一条环路上有 N 个加油站,其中第 i 个加油站有汽油 gas[i] 升。 你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。 如果你可以绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1。 说明: 如果题目有解,该答案即为唯一答案。 输入数组均为非空数组,且长度相同。 输...

ayang818 's blog 233

【LeetCode-中等题】73. 矩阵置零

【代码】【LeetCode-中等题】73. 矩阵置零。

weixin_45618869的博客 988

MIKE水动力笔记1_岸线及水深数据之依靠全球数据库资源提取的方法

通过各种数据库资源来获取全球岸线及水深数据,这种方法获取的岸线及水深数据精度偏低,比较适合大尺度范围的水动力研究。

晏长街的博客 1万+

LeetCode73-矩阵置零

LeetCode73-矩阵置零 给定一个 m x n 的矩阵,如果一个元素为 0,则将其所在行和列的所有元素都设为 0。请使用原地算法。 示例 1: 输入: [ [1,1,1], [1,0,1], [1,1,1] ] 输出: [ [1,0,1], [0,0,0], [1,0,1] ] 示例 2: 输入: [ [0,1,2,0], [3,4,5,2], [...

lyd1995的博客 690

OCR文字识别基础

ocr文字识别

m0_47405013的博客 1755

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

LeetCode第73题_矩阵置零

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

qq_40263592的博客 1489

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

73. 矩阵置零 - 力扣(LeetCode)

如果 i 在 row 集合中(即 i == 0 或 i == 2),或者 j 在 col 集合中(即 j == 1 或 j == 2),则将该元素置零。输入:matrix = [[0,1,2,0],[3,4,5,2],[1,3,1,5]]输入:matrix = [[1,1,1],[1,0,1],[1,1,1]][4, 0, 0], # 第 1 行的第 1 和第 2 列被置零。输出:[[0,0,0,0],[0,4,5,0],[0,3,1,0]]输出:[[1,0,1],[0,0,0],[1,0,1]]

q1111111da的博客 536

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

LeetCode 73. 矩阵置零——每日一题

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

晴空๓ 2285

LeetCode 力扣 73. 矩阵置零

题目描述(中等难度) 给定一个矩阵,然后找到所有含有 0 的地方,把该位置所在行所在列的元素全部变成 0。 解法一 暴力解法,用一个等大的空间把给定的矩阵存起来,然后遍历这个矩阵,遇到 0 就把原矩阵的当前行,当前列全部变作 0,然后继续遍历。 public void setZeroes(int[][] matrix) { int row = matrix.length; int...

wind_liang的博客 984

【LeetCode-73.矩阵置零】

难度:中。

Hermione_pudding的博客 585

Leetcode73. 矩阵置零

则将其所在行和列的所有元素都设为。希望自己可以坚持下去。方法--天涯明月 共勉。的矩阵,如果一个元素为。

GQ_666的博客 999

LeetCode 73 矩阵置零

LeetCode 73 矩阵置零

qq_43745578的博客 983

73. 矩阵置零【 力扣(LeetCode) 】

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

yyh520025的博客 754

LeetCode 73矩阵置零

LeetCode 73矩阵置零 题目简述:给定一个 m x n的矩阵,如果一个元素为 0,则将其所在行和列的所有元素都设为 0。 示例: 输入: 输出: [ [ [1,1,1], [1,0,1], [1,0,1], [0,0,0], [1,1,1] [1,0,1] ] ] 思路一:利用额外空间存储为0的坐标,根据X Y坐标

XBlog 196

leetcode 73.矩阵置零

为什么不能边遍历边改?如果在遍历到时立刻把第i行全改成 0,那么当你遍历到该行后面的元素时,会误以为它们原本就是 0,从而导致错误的连锁反应(整个矩阵可能全变 0)。方案二的执行顺序为什么这么重要?先检查首行首列:防止标记覆盖原始信息。中间先标记后清洗:利用首行首列记录信息,然后清洗内部数据。最后处理首行首列:如果在清洗内部数据之前就先把首行首列清零了,那么内部数据在判断时就会全部命中,导致错误。面试回答策略“首先,我们可以用两个数组来记录行和列的状态,这样逻辑很清晰,时间复杂度OMN。

2403_86950176的博客 379

leetcode73-矩阵置零

leetcode73-矩阵置零

weixin_45799371的博客 668
上一篇: Leetcode 66. 加一
下一篇: Leetcode 74. 搜索二维矩阵
一纸浮萍
博客等级 码龄9年 11粉丝 103原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值