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

LeetCode hot100 -73.矩阵置零

首先第一种方法:我们可以用两个boolean类型的数组来记录行和列是否存在0。然后去遍历所有元素时,碰到0时就将其对应的行和列的boolean类型数组对应位置置为true。再用for循环去遍历将有0的行和列全部置为0。

代码如下:

这种方法的时间复杂度很容易知道为O(m*n)

因为你额外的创建了两个boolean类型的数组,所以空间复杂度为O(m+n)的

class Solution { public void setZeroes(int[][] matrix) { int m = matrix.length; int 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] = 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(1)

我们可以参照EXCEL表格的思想,将行和列有没有0都汇集在第一行和第一列。比如说一个3*3的矩阵,中甲的位置为0,那么就将它左边第二行第一列的元素和第一行第二列置为0。

最后我们只需要遍历第一行和第一列就可以知道哪行和哪列需要被全部置为0了。但是这样做真的没问题吗?那第一行和第一列本来有没有0呢,有的话也需要全部置为0,没有的话只有个别位置置为0。那么我们在刚开始遍历的时候就要先判断第一行和第一列是否原来就有0,有的话在最后将其全部置为0。

代码如下:

class Solution { public void setZeroes(int[][] matrix) { int m = matrix.length; int n = matrix[0].length; // 记录第一行是否包含 0 boolean firstRowHasZero = false; for (int x : matrix[0]) { if (x == 0) { firstRowHasZero = true; break; } } // 记录第一列是否包含 0 boolean firstColHasZero = false; for (int i = 0; i < m; i++) { if (matrix[i][0] == 0) { firstColHasZero = true; break; } } // 用第一列 matrix[i][0] 保存 rowHasZero[i] // 用第一行 matrix[0][j] 保存 colHasZero[j] for (int i = 1; i < m; i++) { // 无需遍历第一行,如果 matrix[0][j] 本身是 0,那么相当于 colHasZero[j] 已经是 true for (int j = 1; j < n; j++) { // 无需遍历第一列,如果 matrix[i][0] 本身是 0,那么相当于 rowHasZero[i] 已经是 true if (matrix[i][j] == 0) { matrix[i][0] = 0; // 相当于 rowHasZero[i] = true matrix[0][j] = 0; // 相当于 colHasZero[j] = true } } } for (int i = 1; i < m; i++) { // 跳过第一行,留到最后修改 for (int j = 1; j < n; j++) { // 跳过第一列,留到最后修改 if (matrix[i][0] == 0 || matrix[0][j] == 0) { // i 行或 j 列有 0 matrix[i][j] = 0; } } } // 如果第一列一开始就包含 0,那么把第一列全变成 0 if (firstColHasZero) { for (int[] row : matrix) { row[0] = 0; } } // 如果第一行一开始就包含 0,那么把第一行全变成 0 if (firstRowHasZero) { Arrays.fill(matrix[0], 0); } } }

其他更精简的代码可参考:

作者:灵茶山艾府
链接:https://leetcode.cn/problems/set-matrix-zeroes/solutions/3799648/yi-bu-bu-you-hua-cong-omn-dao-o1-kong-ji-fdgt/

http://www.jsqmd.com/news/706918/

相关文章:

  • Openblock-Web与OpenBlock-Desktop 开发与构建
  • 2026商标设计注册全流程解析:农产品logo设计、医疗健康logo设计、医疗健康商标设计、原创logo设计、商标设计全包选择指南 - 优质品牌商家
  • 用OpenCV和Streamlit,5分钟把你的图片处理Demo变成可分享的Web应用
  • 成都地区、H型钢、588X300X12X20、Q235B、安泰、现货批发供应 - 四川盛世钢联营销中心
  • Bidili Generator应用场景:电商海报、社交配图、头像壁纸,SDXL定制化图片生成实战
  • 2026Q2酒店旧货回收市场:酒店旧货回收市场/酒店设备二手回收/酒店设备旧货回收市场/铝合金门窗二手回收/铝合金门窗旧货回收市场/选择指南 - 优质品牌商家
  • UART问题解析
  • 2026成都合同纠纷维权指南:成都劳动合同纠纷律师事务所/成都合伙合同纠纷律师事务所/成都合同欠款纠纷律师事务所/选择指南 - 优质品牌商家
  • 2026年优秀单元门标杆名录:铝合金窗/防火卷帘门/防火门/防爆门/防盗门/隔音门/不锈钢门/保温门/别墅大门/选择指南 - 优质品牌商家
  • 2026丙烯酸复合橡胶弹性隔声涂层厂家排行:四川楼板隔声材料厂家、四川隔声材料哪家专业、四川隔声材料哪家好、地面隔音涂料选择指南 - 优质品牌商家
  • MySQL 零基础全套入门教程|DDL+DML + 五大约束 + DQL 查询(超详细代码笔记)
  • 先进制造与高端装备类航空发动机研制项目方案
  • HashMap底层原理
  • 成都地区、H型钢、400X400X13X21、Q235B、安泰、现货批发供应 - 四川盛世钢联营销中心
  • 好用的景观灯源头厂家哪个靠谱
  • Power BI学习笔记第20篇:面试题汇总 · 第三篇:高级应用与最佳实践篇
  • 成都地区、H型钢、390X300X10X16、Q235B、安泰、现货批发供应 - 四川盛世钢联营销中心
  • AI写论文不用愁!4款AI论文写作工具,快速产出高质量论文!
  • CAM++说话人识别系统快速入门:科哥镜像3步搭建声纹验证工具
  • S32K3双核实战:手把手教你配置CAN与CANFD,中断和轮询到底怎么选?
  • 工业数字隔离技术与高可靠性设计实战指南
  • 从Transformer到大模型:主流预训练模型架构演进与Transformers库实战指南
  • 【MySQL深入详解】第18篇:索引维护——保持索引高效的日常操作
  • 成都地区、H型钢、340X250X9X14、Q235B、安泰、现货批发供应 - 四川盛世钢联营销中心
  • 2026 成都GEO优化服务商行业分析报告(橙鱼传媒专项研究)
  • LM文生图镜像部署教程:非技术人员也能理解的Web服务启动逻辑
  • SOLIDWORKS异形孔向导3D草图约束
  • Phi-3-mini-4k-instruct-gguf镜像部署教程:适配A10/A100/T4的vLLM GPU算力配置
  • 2026Q2热门上海财务代理:上海财务代理记账、上海财务咨询、上海财务外包、上海财务审计报告、上海外资公司注册选择指南 - 优质品牌商家
  • 避开中介套路,姚店长给购房者满满的安心