码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • [坚持打卡23天]力扣leetcode 面试题 01.08. 零矩阵


    CSDN话题挑战赛第2期
    参赛话题:算法题解

    文章目录

    • 题目链接与描述
    • 关键词: 标记数组
    • 方法一:标记数组 m n
      • 运行截图
      • 代码
    • 方法二:m + n 的复杂度
      • 运行截图
      • 代码
    • 方法三: 1 的空间复杂度;mn的时间复杂度
      • 运行截图
      • 代码
    • 结尾

    在这里插入图片描述
    往期打卡回顾总结:

    • 第一天的图的节点通路dfs、bfs,顺便复习一下图的相关概念
    • 第二天的模拟题,重新排列单词间的空格
    • 第三天快慢指针,重新分组数字
    • 第四天也是归纳题,优美队列
    • 第五天,动态规划,最长定差数列
    • 第六天,修建二叉树,回顾树的遍历
    • 第七天,打工人,k人最低成本题
    • 第八天,二分查找,数组特征值
    • 第九天,贪心算法,最大交换
    • 第十一天,真值表,找规律,灯泡开关
    • 第十二天,第一次接触扫描线,覆盖面积
    • 第十三天,滑动窗口,hash表,相同字符间最长字串
    • 第十五天,矩阵,hash表,人工岛
    • 第十六天,剪枝,递归,求k个相等子集
    • 第十八天,也是hash表,是否能连成数组
    • 第二十天,三种方式、异或、求和、原地hash,求消失两位数
    • 第二十一天,hash表、重排序,字符重排
    • 第二十二天,字符匹配,字符串轮转

    题目链接与描述

    编写一种算法,若M × N矩阵中某个元素为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]
    ]

    关键词: 标记数组

    这道题,标注是中等题。

    1. 首先考虑存储原始0值位置后,将横纵置0即可

    方法一:标记数组 m n

    运行截图

    在这里插入图片描述

    代码

    
    	public void setZeroes(int[][] matrix) {
    		boolean[][] zero = new boolean[matrix.length][matrix[0].length];
    		for (int i = 0; i < matrix.length; i++) {
    			for (int j = 0; j < matrix[i].length; j++) {
    				zero[i][j] = matrix[i][j] == 0;
    			}
    		}
    		for (int i = zero.length - 1; i >= 0; i--) {
    			for (int j = zero[i].length - 1; j >= 0; j--) {
    				if (zero[i][j]) {
    					setZeroesXY(matrix, i, j);
    				}
    			}
    		}
    	}
    
    	private void setZeroesXY(int[][] matrix, int i, int j) {
    		for (int i1 = matrix.length - 1; i1 >= 0; i1--) {
    			matrix[i1][j] = 0;
    		}
    		for (int j1 = matrix[i].length - 1; j1 >= 0; j1--) {
    			matrix[i][j1] = 0;
    		}
    	}
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    方法二:m + n 的复杂度

    和稀疏图一样,我们使用m x n 的矩阵很多空间是浪费掉了,我们只需要一行或者一列即可,同时遍历的时候也只需要满足在行列上有0即可

    运行截图

    在这里插入图片描述

    代码

    public void setZeroes(int[][] matrix) {
    		boolean[] row = new boolean[matrix.length];
    		boolean[] col = new boolean[matrix[0].length];
    		for (int i = 0; i < matrix.length; i++) {
    			for (int j = 0; j < matrix[i].length; j++) {
    				if (matrix[i][j] == 0) {
    					row[i] = col[j] = true;
    				}
    			}
    		}
    		for (int i = matrix.length - 1; i >= 0; i--) {
    			for (int j = matrix[i].length - 1; j >= 0; j--) {
    				if (col[j] || row[i]) {
    					matrix[i][j] = 0;
    				}
    			}
    		}
    	}
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    方法三: 1 的空间复杂度;mn的时间复杂度

    开始看题解了,第一遍还没懂,中等难度也可能是在这里,实现出来简单,要求对应时间空间复杂度的难想;

    思路就是利用行列都会消掉,把矩阵的0位用来存储是否消除,节省了m+n的空间,但是需要注意如果开始0位上有0,那么需要额外处理对应行列;

    运行截图

    在这里插入图片描述

    代码

    
    
    	public void setZeroes(int[][] matrix) {
    		int n = matrix.length, m = matrix[0].length;
    		// 起始0位是否有0
    		boolean row0 = false;
    		boolean col0 = false;
    		for (int i = 0; i < n; i++) {
    			if (matrix[i][0] == 0) {
    				col0 = true;
    				break;
    			}
    		}
    		for (int j = 0; j < m; j++) {
    			if (matrix[0][j] == 0) {
    				row0 = true;
    				break;
    			}
    		}
    		// 从1位开始,归拢到0位
    		for (int i = 1; i < n; i++) {
    			for (int j = 1; j < m; j++) {
    				if (matrix[i][j] == 0) {
    					matrix[0][j] = matrix[i][0] = 0;
    				}
    			}
    		}
    		// 开始遍历1判断是否需要消除
    		for (int i = 1; i < n; i++) {
    			for (int j = 1; j < m; j++) {
    				if (matrix[0][j] == 0 || matrix[i][0] == 0) {
    					matrix[i][j] = 0;
    				}
    			}
    		}
    		if (col0) {
    			for (int i = 0; i < n; i++) {
    				matrix[i][0] = 0;
    			}
    		}
    
    		if (row0) {
    			for (int i = 0; i < m; i++) {
    				matrix[0][i] = 0;
    			}
    		}
    	}
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48

    结尾

    欢迎评论区交流,每日打卡,冲冲冲!!!

  • 相关阅读:
    二、VXLAN BGP EVPN基本原理
    ​单级高频谐振小放
    Linux下手动修改服务器时间(没网环境下)
    Spring-SpEL表达式超级详细使用全解
    嵌入式复习题
    基于SpringBoot的SSMP整合案例(业务层基础开发与快速开发)
    CAD如何绘制叶轮?
    hadoop 3.3大数据集群搭建系列3-安装Hive
    5VUSB输入双节磷酸铁锂电池串联应用升压充电管理IC-YB5081
    数据结构学习笔记—— 排序算法总结【ヾ(≧▽≦*)o所有的排序算法考点看这一篇你就懂啦!!!】
  • 原文地址:https://blog.csdn.net/qq_35530042/article/details/127129242
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号