热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

[坚持打卡23天]力扣leetcode面试题01.08.零矩阵

CSDN话题挑战赛第2期参赛话题:算法题解文章目录题目链接与描述关键词:标记数组方法一:标记数组mn运行截图代码方法二:mn

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 &#61; new boolean[matrix.length][matrix[0].length];for (int i &#61; 0; i < matrix.length; i&#43;&#43;) {for (int j &#61; 0; j < matrix[i].length; j&#43;&#43;) {zero[i][j] &#61; matrix[i][j] &#61;&#61; 0;}}for (int i &#61; zero.length - 1; i >&#61; 0; i--) {for (int j &#61; zero[i].length - 1; j >&#61; 0; j--) {if (zero[i][j]) {setZeroesXY(matrix, i, j);}}}}private void setZeroesXY(int[][] matrix, int i, int j) {for (int i1 &#61; matrix.length - 1; i1 >&#61; 0; i1--) {matrix[i1][j] &#61; 0;}for (int j1 &#61; matrix[i].length - 1; j1 >&#61; 0; j1--) {matrix[i][j1] &#61; 0;}}

方法二&#xff1a;m &#43; n 的复杂度

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


运行截图

在这里插入图片描述


代码

public void setZeroes(int[][] matrix) {boolean[] row &#61; new boolean[matrix.length];boolean[] col &#61; new boolean[matrix[0].length];for (int i &#61; 0; i < matrix.length; i&#43;&#43;) {for (int j &#61; 0; j < matrix[i].length; j&#43;&#43;) {if (matrix[i][j] &#61;&#61; 0) {row[i] &#61; col[j] &#61; true;}}}for (int i &#61; matrix.length - 1; i >&#61; 0; i--) {for (int j &#61; matrix[i].length - 1; j >&#61; 0; j--) {if (col[j] || row[i]) {matrix[i][j] &#61; 0;}}}}

方法三&#xff1a; 1 的空间复杂度&#xff1b;mn的时间复杂度

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

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


运行截图

在这里插入图片描述


代码

public void setZeroes(int[][] matrix) {int n &#61; matrix.length, m &#61; matrix[0].length;// 起始0位是否有0boolean row0 &#61; false;boolean col0 &#61; false;for (int i &#61; 0; i < n; i&#43;&#43;) {if (matrix[i][0] &#61;&#61; 0) {col0 &#61; true;break;}}for (int j &#61; 0; j < m; j&#43;&#43;) {if (matrix[0][j] &#61;&#61; 0) {row0 &#61; true;break;}}// 从1位开始,归拢到0位for (int i &#61; 1; i < n; i&#43;&#43;) {for (int j &#61; 1; j < m; j&#43;&#43;) {if (matrix[i][j] &#61;&#61; 0) {matrix[0][j] &#61; matrix[i][0] &#61; 0;}}}// 开始遍历1判断是否需要消除for (int i &#61; 1; i < n; i&#43;&#43;) {for (int j &#61; 1; j < m; j&#43;&#43;) {if (matrix[0][j] &#61;&#61; 0 || matrix[i][0] &#61;&#61; 0) {matrix[i][j] &#61; 0;}}}if (col0) {for (int i &#61; 0; i < n; i&#43;&#43;) {matrix[i][0] &#61; 0;}}if (row0) {for (int i &#61; 0; i < m; i&#43;&#43;) {matrix[0][i] &#61; 0;}}}

结尾

欢迎评论区交流&#xff0c;每日打卡&#xff0c;冲冲冲&#xff01;&#xff01;&#xff01;


推荐阅读
  • Redis 是一个高性能的开源键值存储系统,支持多种数据结构。本文将详细介绍 Redis 中的六种底层数据结构及其在对象系统中的应用,包括字符串对象、列表对象、哈希对象、集合对象和有序集合对象。通过12张图解,帮助读者全面理解 Redis 的数据结构和对象系统。 ... [详细]
  • 大华股份2013届校园招聘软件算法类试题D卷
    一、填空题(共17题,每题3分,总共51分)1.设有inta5,*b,**c,执行语句c&b,b&a后,**c的值为________答:5 ... [详细]
  • 本文详细介绍了如何对一个整数的二进制表示进行逆序操作。通过多种方法,包括直接法、查表法和分治法,帮助读者全面理解和掌握这一技术。 ... [详细]
  • PHP函数的工作原理与性能分析
    在编程语言中,函数是最基本的组成单元。本文将探讨PHP函数的特点、调用机制以及性能表现,并通过实际测试给出优化建议。 ... [详细]
  • 在一个整型数组中,除了两个数字只出现一次外,其他所有数字都出现了两次。编写一个程序来找出这两个只出现一次的数字。 ... [详细]
  • 面试题总结_2019年全网最热门的123个Java并发面试题总结
    面试题总结_2019年全网最热门的123个Java并发面试题总结 ... [详细]
  • 优先队列是一种特殊的队列,不遵循先进先出原则。它分为最大优先队列和最小优先队列。最大优先队列总是将当前最大的元素优先出队,而最小优先队列则总是将当前最小的元素优先出队。本文将详细介绍如何使用二叉堆在C#中实现这两种优先队列。 ... [详细]
  • YOLO由24层ConvNet和2层FCs组成。其核心思想是将图片均匀划分为多个gridcell,每个gridcell产生两个bbox和gridcell中如果存在对象,对象是各类的 ... [详细]
  • ipsec 加密流程(二):ipsec初始化操作
    《openswan》专栏系列文章主要是记录openswan源码学习过程中的笔记。Author:叨陪鲤Email:vip_13031075266163.comDate:2020.1 ... [详细]
  • LeetCode 实战:寻找三数之和为零的组合
    给定一个包含 n 个整数的数组,判断该数组中是否存在三个元素 a、b、c,使得 a + b + c = 0。找出所有满足条件且不重复的三元组。 ... [详细]
  • LeetCode 312. 戳气球 【动态规划】【Java】【困难】
    本文将详细介绍 LeetCode 312. 戳气球 问题的背景、解题思路及实现方法,包括题目描述、解题策略、代码实现及解题过程。 ... [详细]
  • 本文整理了一份基础的嵌入式Linux工程师笔试题,涵盖填空题、编程题和简答题,旨在帮助考生更好地准备考试。 ... [详细]
  • 兆芯X86 CPU架构的演进与现状(国产CPU系列)
    本文详细介绍了兆芯X86 CPU架构的发展历程,从公司成立背景到关键技术授权,再到具体芯片架构的演进,全面解析了兆芯在国产CPU领域的贡献与挑战。 ... [详细]
  • 2020年9月15日,Oracle正式发布了最新的JDK 15版本。本次更新带来了许多新特性,包括隐藏类、EdDSA签名算法、模式匹配、记录类、封闭类和文本块等。 ... [详细]
  • 本文详细介绍了如何使用Python的多进程技术来高效地分块读取超大文件,并将其输出为多个文件。通过这种方式,可以显著提高读取速度和处理效率。 ... [详细]
author-avatar
853530960_eafb59
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有