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

73. 矩阵置零

73. 矩阵置零

已解答

中等

提示

给定一个mxn的矩阵,如果一个元素为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 <= m, n <= 200
  • -231 <= matrix[i][j] <= 231 - 1

📝 核心笔记:矩阵置零 (标记数组法)

1. 核心思想 (一句话总结)

“先记账,后清算”。

不能遍历到一个 0 就立刻把整行整列变 0(因为这会污染后续的遍历,导致全变成 0)。

必须先用两个辅助数组把“哪些行、哪些列坏了”记录下来,最后统一执行死刑。

2. 算法流程 (两遍扫描)
  1. 第一遍 (记录):遍历矩阵,只要发现matrix[i][j] == 0,就在小本本上记下:row[i] = truecol[j] = true
  2. 第二遍 (执行):再次遍历矩阵,只要当前格子所在的被记过,就将该格设为 0。

🔍 代码回忆清单 (带注释版)

// 题目:LC 73. 矩阵置零 class Solution { public void setZeroes(int[][] matrix) { int m = matrix.length; int n = matrix[0].length; // 关键点1:空间复杂度 O(m+n) 的辅助数组 boolean[] rowHasZero = new boolean[m]; boolean[] colHasZero = new boolean[n]; // 阶段一:扫描并标记 for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { if (matrix[i][j] == 0) { rowHasZero[i] = true; // 标记第 i 行要死 colHasZero[j] = true; // 标记第 j 列要死 } } } // 阶段二:根据标记置零 for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { // 关键点2:是“或”的关系。只要占一条,就得变0 if (rowHasZero[i] || colHasZero[j]) { matrix[i][j] = 0; } } } } }

⚡ 快速复习 CheckList (易错点)

  • [ ]为什么不能一边遍历一边置零?
    • 因为如果把matrix[i][j]变成 0,下一步遍历到它时,会被误认为是原始的 0,导致把不该置零的行/列也置零了(类似病毒扩散)。必须状态分离
  • [ ]空间复杂度是多少?
    • $O(m + n)$。使用了两个 boolean 数组。
  • [ ]逻辑关系?
    • 第二步判断时是row[i] || col[j](只要有一头是0,这个交叉点就是0)。

🚀 进阶提示 (面试高频追问)

你当前的代码是标准解法 ($O(m+n)$ 空间)。

面试官有 90% 的概率 会追问:“能把空间优化到 $O(1)$ 吗?”

$O(1)$思路回顾:

  • 不创建新数组,直接利用矩阵的第一行第一列来代替rowHasZerocolHasZero数组。
  • 但要额外用两个变量记录“第一行本身有没有0”和“第一列本身有没有0”,防止第一行/列被内部数据污染。
http://www.zskr.cn/news/111748.html

相关文章:

  • Java计算机毕设之基于java的餐厅信息管理系统设计西餐厅管理系统设计(完整前后端代码+说明文档+LW,调试定制等)
  • 活动力度大的门头招牌企业
  • 系统敏感安全文件路径
  • 神经网络实战:AlexNet训练花卉分类
  • 区块链交易所技术革命白皮书:如何用分布式架构扛住量子计算时代?
  • DApp开发暴风指南:7天从零到上线,手把手教你用代码撬动Web3流量红利
  • 2025 全国最新水池布厂家TOP5 评测!云南等地优质企业权威榜单发布,赋能现代设施农业 - 全局中转站
  • 零碳园区应急能源基础架构规划:备用电源与清洁能源联动配置
  • 冥想第一千七百三十五天(1735)
  • 【课程设计/毕业设计】基于SpringBoot的在线天气查询系统基于springboot天气预报查询系统【附源码、数据库、万字文档】
  • 【MongoDB实战】5.1 聚合管道基础:理解阶段(Stage)概念
  • 【计算机毕设】移动互联时代新闻编辑力探析(系统配套LW+开题报告+任务书)
  • 如何降低对标注数据的依赖,实现多病种检测与病灶精准定位?请看此文
  • 简单的创建一个Spring Boot网页
  • 长沙美食小吃攻略|五一广场 和 太平老街:不是来旅游,是来“吃服”的! - 资讯焦点
  • Nano Banana Pro:设计师的威胁,还是创意领域的新伙伴?
  • BioSIM 抗人 IL-1b 抗体SIM0362:多种应用兼容性,适应多样化实验需求
  • AI一周重要会议和活动(12.15-12.22)
  • 【c++】——c++编译的so中函数有额外的字符
  • 从工具到思维:构筑持续测试的文化基石
  • 清理linux大文件
  • Unity场景后处理小记 - 实践
  • 【Android驱动14】Android系统Crash工具使用方法和分析
  • HTR3236 36路LED PWM驱动器全方位介绍
  • 出国点餐看不懂菜单?别慌!用微信“扫一扫”就能搞定
  • PMSM永磁同步电机电控设计高手晋级之路:高清视频,深度解析,技术细节一网打尽
  • Flutter 性能优化实战:从 60fps 到丝滑如原生的 120fps
  • 私有部署+全能定制!开源投票系统分享 小程序投票+H5投票二合一
  • 全能小微企业报告API接口调用代码流程、接入方法以及应用场景
  • 降本增效利器!这款洗车小程序源码助您轻松搭建管理平台