当前位置: 首页 > article >正文

LeetCode HOT 100 —— 矩阵置零(多种解法详解)

题目描述LeetCode 73. 矩阵置零给定一个m x n的矩阵如果一个元素为0则将其所在行和列的所有元素都设为0。请使用原地算法。示例 1text输入matrix [[1,1,1],[1,0,1],[1,1,1]] 输出[[1,0,1],[0,0,0],[1,0,1]]示例 2text输入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]]进阶一个直观的解决方案是使用 O(mn) 的额外空间但这并不是一个好的解决方案。一个简单的改进方案是使用 O(m n) 的额外空间但这仍然不是最好的解决方案。你能想出一个仅使用常量空间的解决方案吗解题思路这道题最大的坑点在于如果在遍历过程中直接修改矩阵新赋值的0会影响后续判断导致整个矩阵全变成0。因此我们需要采取先标记后修改的策略。下面介绍三种解法从最容易想到到最节省空间逐步优化。解法一标记数组O(mn) 空间思路这是最直观的解法。我们创建两个布尔数组row和col分别记录每一行和每一列是否需要被置零。第一次遍历矩阵如果matrix[i][j] 0则将row[i]和col[j]都标记为true。第二次遍历矩阵如果row[i]或col[j]为true则将当前位置置为 0。代码实现javaclass Solution { public void setZeroes(int[][] matrix) { int m matrix.length, n matrix[0].length; boolean[] row new boolean[m]; boolean[] col new boolean[n]; // 第一次遍历记录哪些行和列需要置零 for (int i 0; i m; i) { for (int j 0; j n; j) { if (matrix[i][j] 0) { row[i] true; col[j] true; } } } // 第二次遍历根据标记置零 for (int i 0; i m; i) { for (int j 0; j n; j) { if (row[i] || col[j]) { matrix[i][j] 0; } } } } }复杂度分析时间复杂度O(m × n)需要遍历两次矩阵。空间复杂度O(m n)需要两个额外数组。解法二两个标记变量O(1) 空间优化版思路能不能不使用额外数组我们可以利用矩阵的第一行和第一列来存储标记信息。具体做法用两个布尔变量rowZero和colZero记录第一行和第一列本身是否原本包含 0。从(1,1)位置开始遍历如果matrix[i][j] 0则将matrix[i][0]和matrix[0][j]标记为 0。第二次遍历从(1,1)开始如果matrix[i][0] 0或matrix[0][j] 0则将当前位置置为 0。最后根据rowZero和colZero决定是否将第一行和第一列置为 0。为什么要单独记录第一行和第一列因为第一行和第一列同时承担了存储标记的角色它们原本的状态会被覆盖。如果不提前记录我们就不知道第一行和第一列本身是否需要被置零。代码实现javaclass Solution { public void setZeroes(int[][] matrix) { int m matrix.length, n matrix[0].length; boolean rowZero false, colZero false; // 1. 记录第一行和第一列是否原本包含 0 for (int i 0; i m; i) { if (matrix[i][0] 0) colZero true; } for (int j 0; j n; j) { if (matrix[0][j] 0) rowZero true; } // 2. 使用第一行和第一列作为标记 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; } } } // 3. 根据标记置零从 (1,1) 开始 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; } } } // 4. 最后处理第一行和第一列 if (rowZero) { for (int j 0; j n; j) matrix[0][j] 0; } if (colZero) { for (int i 0; i m; i) matrix[i][0] 0; } } }复杂度分析时间复杂度O(m × n)空间复杂度O(1)解法三一个标记变量极简版思路能否进一步优化只用一个标记变量答案是肯定的。我们只用colZero记录第一列是否包含 0而第一行是否包含 0 的信息可以存储在matrix[0][0]中。但这里有一个关键细节置零操作需要从最后一行开始倒序进行。因为matrix[0][0]既代表第一行的状态也代表第一列的状态如果正序处理第一行的状态可能会被提前覆盖。代码实现javaclass Solution { public void setZeroes(int[][] matrix) { int m matrix.length, n matrix[0].length; boolean colZero false; for (int i 0; i m; i) { // 检查第一列是否有 0 if (matrix[i][0] 0) colZero true; // 检查其他列并将标记存储在第一行和第一列 for (int j 1; j n; j) { if (matrix[i][j] 0) { matrix[i][0] 0; matrix[0][j] 0; } } } // 倒序遍历避免标记被覆盖 for (int i m - 1; i 0; i--) { for (int j 1; j n; j) { if (matrix[i][0] 0 || matrix[0][j] 0) { matrix[i][j] 0; } } if (colZero) { matrix[i][0] 0; } } } }复杂度分析时间复杂度O(m × n)空间复杂度O(1)三种解法对比解法空间复杂度优点缺点标记数组O(mn)简单直观不易出错需要额外空间两个标记变量O(1)空间最优思路清晰需要单独记录第一行/列一个标记变量O(1)最节省空间倒序遍历容易写错可读性略差推荐面试时建议先给出解法一然后主动优化到解法二这样能展示你的优化思维。解法三可以作为扩展了解实际工程中更推荐解法二因为可读性更好。踩坑提醒不要边遍历边置零这是最常见的错误。如果遇到 0 就立即将整行整列置零后面遍历到的 0 可能是刚被赋值的会导致错误地多置零。注意第一行和第一列的特殊性当使用原地标记法时一定要先记录第一行和第一列的原始状态否则它们的状态会丢失。考虑边界情况如果矩阵只有一行或一列确保代码仍然能正确运行。总结这道题的核心思想是标记后置—— 先记录哪些行/列需要置零再进行修改。从 O(mn) 到 O(mn) 再到 O(1) 的空间优化过程是一道非常经典的考察原地算法的题目。掌握这三种解法不仅能帮你通过这道题更能让你对矩阵操作类的题目有更深的理解。题目链接 题解链接题目链接LeetCode 73. 矩阵置零本题题解链接LeetCode 官方题解 - 矩阵置零如果这篇文章对你有帮助欢迎点赞、收藏、关注更多 LeetCode HOT 100 题解持续更新中

相关文章:

LeetCode HOT 100 —— 矩阵置零(多种解法详解)

题目描述 LeetCode 73. 矩阵置零 给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1: text 输入:matrix [[1,1,1],[1,0,1],[1,1,1]] 输出:[[1,0,1],[0,…...

DeerFlow 系列教程 第十五篇 | Guardrails 安全防护与可观测性

DeerFlow 系列教程 第十五篇 本篇教程继续模块四:高级功能与扩展,全面剖析 DeerFlow 的安全防护机制和可观测性体系。我们将深入理解 Guardrails 防护栏的策略执行架构、SandboxAuditMiddleware 的 Bash 命令审计、路径遍历防护与沙箱隔离机制、技能安全扫描、循环检测中间件…...

拯救混乱的日志:用NLog配置变量和规则,让你的.NET项目日志管理清晰10倍

从日志泥潭到清晰航道:NLog结构化配置的工程化实践 当你的.NET项目日志开始呈现指数级增长时,是否经历过这样的困境?凌晨三点被报警叫醒,却要在数十个混杂的日志文件中大海捞针;团队新成员面对错综复杂的日志配置望而…...

100个小工具挑战 #002 | 做了个能直接编辑树形视图的 JSON 格式化工具

起因 今年给自己定了个目标:做 100 个小工具页面。 不是为了流量,就是想把平时开发中遇到的痛点一个个解决掉。这是第 2 个。 第 1 个是发票批量识别工具,这次做的是 JSON 格式化。 为什么要自己做,不用现成的? 用…...

手把手教你用YOLOv11和PyAutoGUI实现屏幕目标自动追踪(附完整Python代码)

基于YOLOv11与PyAutoGUI的屏幕目标自动化追踪技术实战 在数字化办公与自动化测试领域,屏幕目标识别与自动化操作正成为提升效率的关键技术。本文将深入探讨如何利用YOLOv11这一前沿目标检测算法,结合PyAutoGUI这一轻量级自动化工具,构建一个高…...

MiniCPM-V-2_6电商应用实战:商品图多角度比对+卖点文案自动生成

MiniCPM-V-2_6电商应用实战:商品图多角度比对卖点文案自动生成 1. 引言:电商内容创作的痛点与解决方案 电商卖家每天都要面对一个头疼的问题:商品上架需要大量图片和文案。同一个商品要从不同角度拍摄,还要写出吸引人的卖点描述…...

生成式AI对接知识库总卡壳?揭秘92%企业失败的4个底层架构缺陷及实时修复方案

第一章:生成式AI应用知识库集成 2026奇点智能技术大会(https://ml-summit.org) 生成式AI应用与企业知识库的深度集成,正从“文档检索增强”迈向“语义化决策协同”。这一演进依赖于结构化知识注入、实时上下文对齐与可审计推理链构建三大支柱。现代知识…...

你的企业还在靠人工做合规检查?同行已经用 AI 自动预警了 | 实在Agent企业级风险防控方案

进入2026年,企业面临的合规环境已发生质变。随着《数据安全法》深度落地以及AIGC相关强制标准(如GB45438-2025)的严格执行,合规检查不再是每季度的“例行公事”,而是关系到企业生存的“实时防线”。 然而,这…...

为什么说企业的效率差距,核心在自动化能力的差距?2026企业数字化转型:实在Agent重塑人机协同新范式

进入2026年,全球商业竞争的底层逻辑发生了深刻位移。 根据普华永道与麦肯锡的联合调研显示,领先企业与跟随者之间的财务表现差距已拉大至7.2倍。 这种鸿沟的本质,不再是简单的技术有无,而是自动化能力的系统性代差。 当多数企业仍…...

同样的招聘工作,别人 AI 一周筛选千份简历,你的 HR 要加班一个月:2026企业级实在Agent深度实践

在2026年的春招赛道上,企业间的竞争早已从“人才争夺”演变为“筛选效率”的降维打击。 根据最新的行业观察,头部企业通过部署智能体(Agent)技术,已实现从简历抓取、逻辑初筛到面试预约的全链路自动化。 相比之下&…...

3分钟!玩转游戏下载站系统!蜘蛛池seo功能完善部署!

从复杂的建站流程到全自动部署游戏站下载站养站系统,整个流程只要3分钟!养站系统中的每个网站URL路径有2000 0000 0000条!(不需要发文章,自动更新文章,解决seo站长文章问题)游戏站养站功能简述&…...

从SD卡到EMMC:手把手教你用U-Boot的tftp和update_mmc命令完成系统引导迁移

从SD卡到EMMC:U-Boot引导迁移全流程实战指南 当开发板通过SD卡成功启动U-Boot后,如何将引导程序永久写入板载EMMC?这不仅关乎设备能否独立启动,更直接影响产品化部署的可靠性。本文将手把手带你完成从临时启动到永久固件部署的关键…...

Vue3数字动画实战:用vue3-count-to打造数据大屏动态效果(附完整代码)

Vue3数字动画实战:用vue3-count-to打造数据大屏动态效果 数据可视化大屏已经成为企业展示核心指标的重要窗口,而动态数字效果则是其中最抓眼球的元素之一。想象一下,当领导带着客户参观时,大屏上的关键数据从0开始流畅增长到百万级…...

告别环境配置焦虑:在Ubuntu 22.04上为ESP32-S3搭建esp-idf v5.4.2的保姆级避坑指南

告别环境配置焦虑:在Ubuntu 22.04上为ESP32-S3搭建esp-idf v5.4.2的保姆级避坑指南 第一次在Ubuntu上配置ESP-IDF开发环境时,我盯着终端里密密麻麻的报错信息发了半小时呆——明明是按照官方文档一步步操作,为什么总是卡在奇怪的环节&#xf…...

儿童护眼大路灯哪个牌子好用?全网高赞的护眼大路灯十大品牌排行

护眼大路灯通过上下发光能够呈现出舒适且接近太阳光的光线,这样也伴随着护眼落地灯迅速得到众多人的认可火爆市场,护眼灯品牌越来越多,质量参差不齐,存在着一些可能会造成刺眼、眩光以及频闪的劣质护眼灯,所以我们不能…...

别再纠结了!MySQL和PostgreSQL到底怎么选?从CPU核数到索引类型,一次给你讲透

MySQL与PostgreSQL技术选型指南:从架构差异到业务场景适配 当项目面临数据库选型时,技术决策者常常陷入两难境地。作为开源关系型数据库的双雄,MySQL和PostgreSQL各有拥趸,但真正的专业选择应当基于客观的技术特性和实际业务需求。…...

战略仪表盘:搜极星如何成为AI时代品牌竞争的新坐标

战略仪表盘:搜极星如何成为AI时代品牌竞争的新坐标 当前,品牌营销正经历一场静默但剧烈的“底层代码”更换。过往以搜索引擎为核心、以关键词和链接为枢纽的传统范式,在生成式AI的冲击下加速瓦解。当用户不再输入关键词列表,而是…...

从‘删库跑路’到安全操作:详解SQL中DROP SCHEMA/TABLE的CASCADE和RESTRICT到底怎么选

从‘删库跑路’到安全操作:详解SQL中DROP SCHEMA/TABLE的CASCADE和RESTRICT到底怎么选 在数据库管理的日常工作中,DROP命令就像一把双刃剑——它既能快速清理无用数据,也可能因误操作导致灾难性后果。想象一下这样的场景:你在生产…...

深度解析SukiUI Avalonia主题库架构设计与技术实现

深度解析SukiUI Avalonia主题库架构设计与技术实现 【免费下载链接】SukiUI UI Theme for AvaloniaUI 项目地址: https://gitcode.com/gh_mirrors/su/SukiUI SukiUI是基于AvaloniaUI框架构建的现代化UI主题库,专为桌面和移动应用程序提供完整的组件系统与主题…...

深度解析高性能Windows AirPlay 2接收器:架构设计与实现原理

深度解析高性能Windows AirPlay 2接收器:架构设计与实现原理 【免费下载链接】airplay2-win Airplay2 for windows 项目地址: https://gitcode.com/gh_mirrors/ai/airplay2-win AirPlay 2 for Windows 是一个完整的跨平台投屏解决方案,通过逆向工…...

如何快速打造精简Windows 11系统:tiny11builder终极完整指南

如何快速打造精简Windows 11系统:tiny11builder终极完整指南 【免费下载链接】tiny11builder Scripts to build a trimmed-down Windows 11 image. 项目地址: https://gitcode.com/GitHub_Trending/ti/tiny11builder 你是否厌倦了Windows 11系统日益臃肿&…...

解密MAA:如何用计算机视觉技术解放明日方舟玩家的双手?

解密MAA:如何用计算机视觉技术解放明日方舟玩家的双手? 【免费下载链接】MaaAssistantArknights 《明日方舟》小助手,全日常一键长草!| A one-click tool for the daily tasks of Arknights, supporting all clients. 项目地址:…...

MiniMax M2.7 上手体验:国产大模型的“推理派“选手

前两天用阿里的接口感觉慢了很多,国外的模型也被封了,实在受不了一个任务卡半天,瞧着MiniMax上市的股票涨的那么猛,是不是可以试试?于是我把我的龙虾的模型换成了MiniMax-M2.7,和之前的GLM-5执行同样的任务对比了一下效…...

BaiduPCS-Go深度调优指南:10个高级配置技巧提升下载速度与稳定性

BaiduPCS-Go深度调优指南:10个高级配置技巧提升下载速度与稳定性 【免费下载链接】BaiduPCS-Go iikira/BaiduPCS-Go原版基础上集成了分享链接/秒传链接转存功能 项目地址: https://gitcode.com/GitHub_Trending/ba/BaiduPCS-Go BaiduPCS-Go作为一款强大的百度…...

基本数据结构的定义要自己会手写1(二叉树)

(C版本)struct TreeNode {int val;TreeNode *left;TreeNode *right;// 写三个构造函数,提供多种创建节点的方式// 1、无参构造TreeNode() : val(0),left(nullptr),right(nullptr){}// 2、单参构造TreeNode(int x) : val(x),left(nullptr),rig…...

2026届最火的六大AI辅助写作方案推荐

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 当今的学术环境当中,论文 AI 工具已然成了那些研究者的重要辅助办法,…...

测试工程师时间管理:从疲于奔命到游刃有余的高效工作法

对于广大软件测试从业者而言,时间似乎总是不够用。凌晨的办公室里,闪烁的报错红光映照着疲惫的脸庞,这并非个别现象,而是许多同行共同的日常写照。在敏捷开发、快速迭代的现代软件工程中,测试团队常常被重复的用例维护…...

PCB设计小技巧:如何在立创EDA专业版中完美添加二维码(附避坑指南)

PCB设计实战:立创EDA专业版二维码嵌入全流程与避坑指南 在PCB设计领域,二维码的应用已经从简单的产品标识演变为包含生产批次、设计版本、测试参数等关键信息的智能载体。立创EDA专业版作为国产PCB设计工具的代表,其二维码嵌入功能却存在不少…...

从零解析AlexNet:逐层维度推导与PyTorch实战复现

1. AlexNet的前世今生:为什么它改变了计算机视觉 第一次看到AlexNet的论文时,我正坐在实验室的旧电脑前啃着三明治。那是2012年的一个普通下午,谁也没想到这篇论文会成为深度学习革命的导火索。当时主流的图像识别方法还在用SIFT特征SVM分类器…...

2026届最火的六大AI论文工具推荐

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 当下学术情形里,AI相关的论文平台主要被分作三种类型,其一为文献检索…...