LeetCode 热题 100 Day05

矩阵相关题型

Leetcode 73. 矩阵置零【中等】

题意理解:        

        将矩阵中0所在位置,行|列置换为全0

        其中可以通过记录0元素所在的行、列号,来标记要置换的行|列

        将对应位置置换为0

解题思路:        

        第一个思路:

        可以通过两个set: row col 分别用来记录要置换的行|列号

        同时set实现去重,不用重复操作

        遍历row和col,将要置换的行|列,置换为全0

        第二个思路:不适用额外的空间存储,使用矩阵的第一行和第一列进行存储。

        1.flag_row 和flag_col标记原来的第一行|第一列是否有0,有为true

        2.遍历元素(i=1,j=1),当且仅当,当前元素为0是,将对应第一行第一列的位置元素置为0

        3.遍历元素(i=1,j=1),当且仅当,对应行|列头为0时,当前元素为0

        4.处理第一行|第一列,当且仅当flag_row (flag_col)==true时,将第一行(第一列)置换为全0.

1.解题【额外的空间记录】

class Solution {public void setZeroes(int[][] matrix) {Set<Integer> row=new HashSet<>();Set<Integer> col=new HashSet<>();for(int i=0;i<matrix.length;i++){for(int j=0;j<matrix[0].length;j++){if(matrix[i][j]==0){row.add(i);col.add(j);}}}//填充0for(int num:row){for(int j=0;j<matrix[0].length;j++){matrix[num][j]=0;}}for(int num:col){for(int i=0;i<matrix.length;i++){matrix[i][num]=0;}}}
}

1.解题【矩阵本身记录】

class Solution {public void setZeroes(int[][] matrix) {int row=matrix.length;int col=matrix[0].length;boolean flag_row=false,flag_col=false;for(int j=0;j<col;j++){if(matrix[0][j]==0){flag_row=true;break;}}for(int i=0;i<row;i++){if(matrix[i][0]==0){flag_col=true;break;}}//记录for(int i=1;i<row;i++){for(int j=1;j<col;j++){if(matrix[i][j]==0){matrix[i][0]=0;matrix[0][j]=0;}}}//置为0for(int i=1;i<row;i++){for(int j=1;j<col;j++){if(matrix[i][0]==0||matrix[0][j]==0){matrix[i][j]=0;}}}//第一行if(flag_row){for(int j=0;j<col;j++){matrix[0][j]=0;}}//第一列if(flag_col){for(int i=0;i<row;i++){matrix[i][0]=0;}}}
}

2.复杂度分析

时间复杂度:O(n^2) 双for的时间损耗

空间复杂度:O(n) row和col的空间损耗

                     思路二的时间复杂度:O(1) 除了i,j外没有额外的空间损耗

Leetcode 54. 螺旋矩阵【中等】

题意理解:

        从(0,0)位置顺时针螺旋,遍历数据

        

解题思路:

        模拟转向:

        1.模拟螺旋结构进行顺时针转向,其转向总是右下左上,依次循环

        2.我们用directions={右、下、左、上}模拟转向,其中(i+1)%4表示选择的转向

        3.转向的条件:i,j越界,或,下一个位置已经被访问过。

        

        

1.解题【模拟螺旋转向】

class Solution {public List<Integer> spiralOrder(int[][] matrix) {int row=matrix.length;int col=matrix[0].length;List<Integer>  result=new ArrayList<>();if(matrix==null||matrix.length==0||matrix[0].length==0){return result;}int[][] diresction=new int[][]{{0,1},{1,0},{0,-1},{-1,0}};//右下左上boolean[][] visited = new boolean[row][col];int i_index=0,j_index=0;int direct_index=0;for(int i=1;i<=row*col;i++){result.add(matrix[i_index][j_index]);visited[i_index][j_index]=true;int nextRow=i_index+diresction[direct_index][0],nextCol=j_index+diresction[direct_index][1];//越界转向if(nextRow<0||nextRow>=row||nextCol<0||nextCol>=col||visited[nextRow][nextCol]){direct_index=(direct_index+1)%4;}i_index+=diresction[direct_index][0];j_index+=diresction[direct_index][1];}return result;}
}

1.解题【按层模拟,一次遍历转一周】

class Solution {public List<Integer> spiralOrder(int[][] matrix) {int row=matrix.length;int col=matrix[0].length;List<Integer>  result=new ArrayList<>();if(matrix==null||matrix.length==0||matrix[0].length==0){return result;}//上下左右四个边界int top=0,bottom=row-1,left=0,right=col-1;while(left<=right&&top<=bottom){//左for(int j=left;j<=right;j++){result.add(matrix[top][j]);}//下for(int i=top+1;i<=bottom;i++){result.add(matrix[i][right]);}if(left<right&&top<bottom){//右for(int j=right-1;j>left;j--){result.add(matrix[bottom][j]);}//上for(int i=bottom;i>top;i--){result.add(matrix[i][left]);}}left++;right--;top++;bottom--;}return result;}
}

2.复杂度分析

思路一: 

 时间复杂度:O(n) for循环时间损耗

 空间复杂度:O(n^2) visited[][]数组的空间损耗

思路二:

时间复杂度:O(n^2) while+for时间损耗

空间复杂度:O(n) 结果集的空间损耗

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/4594.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

React | classnames

classnames 这个库在我们的项目中有大量的使用到&#xff0c;它不仅很实用&#xff0c;还非常好用&#xff0c;但还有人不知道这个库&#xff0c;我真的是十分心痛。 通过 classnames&#xff0c;我们可以给组件设置多个 className&#xff0c;还可以根据需要动态设置 classNa…

模块四:前缀和——DP35 【模板】二维前缀和

文章目录 题目描述算法原理解法一&#xff1a;暴力模拟&#xff08;时间复杂度为O(n*m*q)&#xff09;解法二&#xff1a;二维前缀和&#xff08;时间复杂度为O(m*n)O(q)) 代码实现解法二&#xff1a;前缀和&#xff08;C)Java 题目描述 题目链接&#xff1a;DP35 【模板】二维…

三星电脑文件夹误删了怎么办?恢复方案在此

在使用三星电脑的过程中&#xff0c;我们可能会不小心删除了某个重要的文件夹&#xff0c;其中可能包含了工作文件、家庭照片、视频或其他珍贵的数据。面对这种突发情况&#xff0c;不必过于焦虑。本文将为您提供几种有效的恢复方案&#xff0c;希望能帮助您找回误删的文件夹及…

openEuler-22.03安装 mysql8.0.32

一、下载解压 下载地址&#xff1a; MySQL :: Download MySQL Community Server (Archived Versions) tar -xvf mysql-8.0.32-1.el7.x86_64.rpm-bundle.tar -C /opt/mysql-8.0.32 二、安装 最开始安装一直报错 缺少 libcrypto.so.10库文件,安装openssl可以解决 wget http://…

Java客户端如何直接调用es的API

Java客户端如何直接调用es的API 一. 问题二. withJson 前言 这是我在这个网站整理的笔记,有错误的地方请指出&#xff0c;关注我&#xff0c;接下来还会持续更新。 作者&#xff1a;神的孩子都在歌唱 一. 问题 今天做项目的时候&#xff0c;想要直接通过java客户端调用es的api…

揭秘工业大模型:从人工智能小白到技术先锋

工业大模型的五个基本问题 信息化时代&#xff0c;数字化转型成为企业提升营运效率、应对经营风险和提升核心竞争力的重要途径。在此过程中&#xff0c;数据作为一种客观存在的资源&#xff0c;所产生的价值日益凸显。党的十九届四中全会从国家治理体系和治理能力现代化的高度将…

【万字长文】看完这篇yolov4详解,那算是真会了

前言 目标检测作为计算机视觉领域的一个核心任务&#xff0c;其目的是识别出图像中所有感兴趣的目标&#xff0c;并给出它们的类别和位置。YOLO&#xff08;You Only Look Once&#xff09;系列模型因其检测速度快、性能优异而成为该领域的明星。随着YOLOv4的推出&#xff0c;…

双塔模型在召回和粗排的区别

答案参考&#xff1a;推荐系统中&#xff0c;双塔模型用于粗排和用于召回的区别有哪些? - 知乎 召回和粗排在不同阶段面临样本不一样&#xff0c;对双塔来说样本分布差异会使召回和粗排采取不一样的方式。召回打分空间是全部item空间&#xff0c;曝光只有很少一部分&#xff0…

【机器学习】集成学习---Bagging之随机森林(RF)

【机器学习】集成学习---Bagging之随机森林&#xff08;RF&#xff09; 一、引言1. 简要介绍集成学习的概念及其在机器学习领域的重要性。2. 引出随机森林作为Bagging算法的一个典型应用。 二、随机森林原理1. Bagging算法的基本思想2. 随机森林的构造3. 随机森林的工作机制 三…

ClickHouse 如何实现数据一致性

文章目录 ReplacingMegreTree 引擎数据一致性实现方式1.ReplacingMegreTree 引擎2.ReplacingMegreTree 引擎 手动合并3.ReplacingMegreTree 引擎 FINAL 查询4.ReplacingMegreTree 引擎 标记 GroupBy5.允许偏差 前言&#xff1a;在大数据中&#xff0c;基本上所有组件都要求…

Docker创建镜像之--------------基于Dockerfile创建

目录 一、在编写 Dockerfile 时&#xff0c;有严格的格式需要遵循 二、Dockerfile 操作常用的指令 2.1ENTRYPOINT和CMD共存的情形 2.2ENTRYPOINT和CMD的区别 2.3ADD 与COPY的区别 三、Dockerfile案例 3.1构建apache镜像 3.1.1 创建镜像目录方便管理 3.1.2创建编写dock…

函数递归与迭代

目录 1.递归 1.1递归的思想 1.2递归的限制条件 2.递归与迭代 1.递归 函数递归是什么&#xff1f; 递归是学习C语⾔函数绕不开的⼀个话题&#xff0c;那什么是递归呢? 递归其实是⼀种解决问题的⽅法&#xff0c;在C语⾔中&#xff0c;递归就是函数⾃⼰调⽤⾃⼰。 写⼀个史…

大模型对数字营销的驱动赋能

一、大模型驱动的营销数智化个信未来发展趋势 1.模型算法能力全面升级 大模型凭借智能化的用户洞察&#xff0c;个性化的需求预测、系统化的数据分析、效率化的营销决策以及实实化的全域检测支持&#xff0c;为营销行业更加准确地把握市场动态和消费者需求提供了强大支持。可以…

Spring Boot 如何实现缓存预热

Spring Boot 实现缓存预热 1、使用启动监听事件实现缓存预热。2、使用 PostConstruct 注解实现缓存预热。3、使用 CommandLineRunner 或 ApplicationRunner 实现缓存预热。4、通过实现 InitializingBean 接口&#xff0c;并重写 afterPropertiesSet 方法实现缓存预热。 1、使用…

数据结构和算法:贪心

贪心算法 贪心算法是一种常见的解决优化问题的算法&#xff0c;其基本思想是在问题的每个决策阶段&#xff0c;都选择当前看起来最优的选择&#xff0c;即贪心地做出局部最优的决策&#xff0c;以期获得全局最优解。 贪心算法和动态规划都常用于解决优化问题。它们之间存在一…

TCP/IP协议族中的TCP(二):解析其关键特性与机制

⭐小白苦学IT的博客主页⭐ ⭐初学者必看&#xff1a;Linux操作系统入门⭐ ⭐代码仓库&#xff1a;Linux代码仓库⭐ ❤关注我一起讨论和学习Linux系统 滑动窗口 在前面我们讨论了确认应答策略, 对每一个发送的数据段, 都要给一个ACK确认应答. 收到ACK后再发送下一个数据段.这样…

力扣HOT100 - 98. 验证二叉搜索树

解题思路&#xff1a; class Solution {public boolean isValidBST(TreeNode root) {return recur(root,Long.MIN_VALUE,Long.MAX_VALUE);}public boolean recur(TreeNode root,long lower,long upper){if(rootnull) return true;if(root.val<lower||root.val>upper) re…

Ubuntu上的screenfetch

2024年4月28日&#xff0c;周日下午 这些文本是由一个叫做 “screenfetch” 的命令生成的&#xff0c;它会显示一些系统和用户信息&#xff0c;包括操作系统、内核版本、系统运行时间、安装的软件包数量、使用的Shell、分辨率、桌面环境、窗口管理器、主题、图标主题、字体、CP…

Matlab进阶绘图第51期—带填充等高线的三维特征渲染散点图

带填充等高线的三维特征渲染散点图是填充等高线图与特征渲染三维散点图的组合。 其中&#xff0c;填充等高线图与特征渲染的三维散点图的颜色用于表示同一个特征。 由于填充等高线图无遮挡但不直观&#xff0c;特征渲染的三维散点图直观但有遮挡&#xff0c;而将二者组合&…

MySQL数据库进阶篇二(优化、视图/存储过程/存储函数/触发器)

目录 一、SQL优化1.1、插入数据1.2、主键优化1.3、order by优化1.4、group by优化1.5、limit优化1.6、count优化1.7、update优化 二、视图/存储过程/存储函数/触发器2.1、视图2.2、存储过程2.3、存储函数2.4、触发器 一、SQL优化 分为&#xff1a;插入数据优化&#xff0c;主键…