【寸铁的刷题笔记】图论、bfs、dfs
【寸铁的刷题笔记】图论、bfs、dfs
大家好 我是寸铁👊
金三银四,图论基础结合bfs、dfs是必考的知识点✨
快跟着寸铁刷起来!面试顺利上岸👋
喜欢的小伙伴可以点点关注 💝
🌞详见如下专栏🌞
🍀🍀🍀寸铁的刷题笔记🍀🍀🍀
200. 岛屿数量
考点
递归、dfs
思路
思路:遍历二维数组,遇到陆地则计数器加
1
然后,向该陆地上、下、左、右四个方向进行搜索。
遇到边界则停止搜索,如果搜索到的网格为陆地,则说明该网格和遍历到的陆地连通。
同时,把该搜索到的陆地'1',置为海洋'0'
由于之前遍历二维数组时遇到陆地时计数器加1,由于连通,算作1个岛屿。
这样就避免下次遍历二维数组时重复遍历陆地,导致岛屿数量多算了。
代码
class Solution {/*思路:遍历二维数组,遇到陆地则计数器加1然后,向该陆地上、下、左、右四个方向进行搜索。遇到边界则停止搜索,如果搜索到的网格为陆地,则该网格和遍历到的陆地连通。同时,把该搜索到的陆地'1',置为海洋'0'由于之前遍历二维数组时遇到陆地时计数器加1,由于连通,算作1个岛屿。这样就避免下次遍历二维数组时,重复遍历陆地,导致岛屿数量多算了。*/public int numIslands(char[][] grid) {int count = 0;//统计陆地的数量for(int i = 0; i < grid.length; i++){ //数组的行数for(int j = 0; j < grid[0].length; j++){//数组的列数if(grid[i][j] == '1'){//如果说遍历到的节点是陆地'1'dfs(grid , i , j);//则调用递归函数将该陆地周围的陆地进行置0操作count++;//陆地数量++ } }}return count;//返回陆地的数量}public void dfs(char [][]grid , int i , int j){//边界条件,遇到边界则搜索停下来。if(i < 0 || j < 0 || i >= grid.length || j >= grid[0].length || grid[i][j] == '0')return;//将陆地周围联通的陆地进行置0 , 避免重复遍历,统计陆地的数量不正确。grid[i][j] = '0';//向上、下、左、右四个方向进行遍历,把能走通的陆地进行置0,避免重复遍历。//上dfs(grid , i -1 , j);//下dfs(grid , i + 1 , j);//左dfs(grid , i , j - 1);//右dfs(grid , i , j + 1);}
}
130. 被围绕的区域
考点
递归、dfs
思路
题目描述
这道题是让我们寻找所有被X围绕的区域,并将这块区域中的所有的'O用X进行填充。
转换问题
那么怎么样去寻找所有被X围绕的区域呢?
直接做肯定不好做,不妨反过来思考,什么样的才是不被X围绕的区域呢?

观察题目图形,我们发现如果
O位于棋盘边界的位置,则说明O不被X所围绕,与外界连通。
那么问题就转换为去搜索从边界的O开始连通的O区域,这一部分连通的区域必定是不满足条件的,也就是不用替换为X的。
所以,我们从边界的位置出发,去搜索从边界的O开始连通的O区域,并把搜索过的O标记为*,避免后面被重复遍历。
如下图绿色为棋盘的边界部分

复原操作
最后,对棋盘的字符进行复原操作,把标记的*复原为X。
剩下的O则为被包围的区域,进行替换为X即可。
代码
class Solution {/*思路:这道题是让我们寻找所有被'X'围绕的区域,并将这块区域中的所有'O'用'X'进行填充。那么,怎么样去寻找所有被'X'围绕的区域呢?直接做肯定不好做,不妨反过来思考,什么样的才是不被'X'围绕的区域呢?观察图形,我们发现如果O位于棋盘边界的位置,则说明'O'不被'X'所围绕。那么问题就转换为去搜索从边界的'O'开始连通的'O'区域,这一部分连通的区域必定是不满足条件的,也就是不用替换为'X'的。所以,我们从边界的位置出发,去搜索从边界的'O'开始连通的'O'区域,并把搜索过的'O'标记为'*',避免后面被重复遍历。最后,对棋盘的字符进行复原操作,把标记的'*'复原为'X'。剩下的'O'则为被包围的区域,进行替换为'X'即可。*/int m;//棋盘的行数int n;//棋盘的列数public void solve(char[][] board) {m = board.length;//行的长度n = board[0].length;//列的长度for(int i = 0; i < m; i++){dfs(board , i , 0);//每一行的第一个位置dfs(board , i , n - 1);//每一行的最后一个位置 }for(int i = 1; i < n - 1; i++){dfs(board , 0 , i);//第一行除了头尾之外的位置dfs(board , m - 1, i);//最后一行除了头尾之外的位置}//dfs处理完毕后,再进行棋盘复原操作for(int i = 0; i < m; i++){for(int j = 0; j < n; j++){//如果说最后的棋盘为O 则直接进行赋值为X即可if(board[i][j] == 'O')board[i][j] = 'X';//把最后棋盘中与外界连通的标记 * 替换为 Oelse if(board[i][j] == '*')board[i][j] = 'O';}}}//寻找与外界棋盘O字符连通的区域public void dfs(char [][]board , int i , int j){//如果说越界了或者说之前被标记为'*'(已经被遍历过)或者是'X'则停止搜索if(i < 0 || j < 0 || i >= m || j >= n || board[i][j] == '*' || board[i][j] == 'X')return;board[i][j] = '*'; //标记为* 表示与外界连通并且这个位置已经被遍历过了,不再重复遍历。//上dfs(board , i - 1 , j);//下dfs(board , i + 1 , j);//左dfs(board , i , j - 1);//右dfs(board , i , j + 1);}
}
133. 克隆图
考点
哈希表、bfs
思路
思想:
bfs,宽搜。
从起点节点开始出发,入队,出队,将该起点节点的邻接节点入队,并标记被搜索过(哈希表记录)
再弹出当前队列的节点,入队,并继续标记其邻接节点。
依次一层一层的搜索下去,直至最后队列为空,说明已经拷贝完图的所有节点。
代码
/*
// Definition for a Node.
class Node {public int val;public List<Node> neighbors;public Node() {val = 0;neighbors = new ArrayList<Node>();}public Node(int _val) {val = _val;neighbors = new ArrayList<Node>();}public Node(int _val, ArrayList<Node> _neighbors) {val = _val;neighbors = _neighbors;}
}
*/class Solution {public Node cloneGraph(Node node) {/*思想:bfs,宽搜。从起点节点开始出发,入队,出队,将该起点节点的邻接节点入队,并标记被搜索过。再弹出当前队列的节点,入队,并继续标记其邻接节点。依次一层一层的搜索下去,直至最后队列为空,说明已经拷贝完图的所有节点。*/if(node == null)return null;//空节点不拷贝Node []cloneNodes = new Node[110];//存储的是每一个已经拷贝(克隆)的节点,标记已被搜索过cloneNodes[node.val] = new Node(node.val);//克隆起点节点Queue<Node>queue = new LinkedList<>();//存储bfs的队列queue.offer(node); //起点节点入队Node cur; // 记录当前处理的节点while(!queue.isEmpty()){cur = queue.poll(); //从队列中获取一个待处理的节点Node cloneNode = cloneNodes[cur.val];//待处理的节点一定是克隆好的,直接获取其克隆节点for(Node neighbor : cur.neighbors){if(cloneNodes[neighbor.val] == null){//如果邻接节点未拷贝则进行拷贝cloneNodes[neighbor.val] = new Node(neighbor.val);queue.offer(neighbor);//邻接节点入队,用于下一轮的节点获取。}//克隆节点的邻居添加入遍历过的拷贝节点的邻接节点cloneNode.neighbors.add(cloneNodes[neighbor.val]);}}//返回克隆节点的记录数组即可return cloneNodes[node.val];}
}
207. 课程表
考点
bfs、拓扑排序
思路
思想: 要想修一门课程,则需要先修它的先修课程。
所以, 我们可以把他看成是一个有向无环图。
判断最后每个点是不是入度、出度为0的节点数等于课程数即可。
做法
-
先将先修课程向要修课程连一条边,同时记录要修课程的
入度。 -
再统计每个点的入度,在
bfs时,将待修课程节点的入度-- -
最后, 判断
入度为0的节点数是否等于课程数。
等于则说明可以完成所有课程的学习。
不等于则说明存在环,陷入死循环中,无法完成课程的学习。
代码
class Solution {/*思想: 要想修一门课程,则需要先修它的先修课程。所以, 我们可以把他看成是一个有向无环图。判断最后每个点是不是入度、出度为0的节点数等于课程数即可。先将先修课程向要修课程连一条边再统计每个点的入度,在bfs搜索时,将先修课程节点的出度--最后, 入读和出度都为0,则说明可以完成所有课程的学习。最后, 判断入度、出度为0的节点数是否等于课程数。等于则说明可以完成所有课程的学习。不等于则说明存在环,陷入死循环中,无法完成课程的学习。*/public boolean canFinish(int numCourses, int[][] prerequisites) {int []indegress = new int[numCourses];List<List<Integer>>adjacency = new ArrayList<>();Queue<Integer> queue = new LinkedList<>();for(int i = 0; i < numCourses; i++){adjacency.add(new ArrayList<>());}for(int []cp : prerequisites){//要想修0必须先修1//对0而言是入度,对1而言是出度indegress[cp[0]]++;//入度++//先修课程向要修课程向连一条边adjacency.get(cp[1]).add(cp[0]);}//寻找入度为0的点开始进行拓扑排序//入度为0则说明它是可以修的课程for(int i = 0; i < numCourses; i++){if(indegress[i] == 0)queue.add(i);}while(!queue.isEmpty()){//弹出入度为0的节点,说明该课程可以被修。int pre = queue.poll();//同时课程数量--numCourses--;//遍历先修课程的节点for(int cur : adjacency.get(pre)){//出度--//如果说点cur的入度与出度都为0//则队列中添加节点cur,用于下一轮的搜索。if(--indegress[cur] == 0){queue.add(cur);}}}//最后,判断一下是不是课程数等于0//如果说课程数等于0 则代表可以完成所有课程的学习。return numCourses == 0;}
}
210. 课程表 II
考点
bfs、拓扑排序
思路
在课程表题目的基础上,多维护一个
数组,用于记录当前弹出的节点的路径(走过的节点)
弹出的节点是入度为0的节点,入度为0说明为已修的先修课程,并且是先修完的,可以按照这个顺序来。
代码
class Solution {//在课程表题目的基础上,多维护一个数组,用于记录当前弹出的节点的路径//弹出的节点是入度为0的节点,入度为0说明为已修的先修课程,并且是先修完的,可以按照这个顺序来。public int[] findOrder(int numCourses, int[][] prerequisites) {int []indegress = new int[numCourses];//记录每个节点的入度List<List<Integer>>adjacency = new ArrayList<>();//维护一个列表用于存储边Queue<Integer>queue = new LinkedList<>();//创建队列,用于存储节点for(int i = 0; i < numCourses; i++){adjacency.add(new ArrayList<>());//每个节点先添加列表用于存连接的节点(边)}for(int []cp : prerequisites){indegress[cp[0]]++; //要修课程的入度++adjacency.get(cp[1]).add(cp[0]);//将先修课程和待修课程连一条边//用于后续遍历入度为0节点的队列将待修课程的入度--//用于下一轮的循环}//先将入度为0的节点添加入队列for(int i = 0; i < numCourses; i++){if(indegress[i] == 0)queue.add(i);}//创建数组ans,用于记录学完所有课程所安排的学习顺序。int ans[] = new int[numCourses];int index = 0;//数组下标,用于存储学完的课程while(!queue.isEmpty()){int pre = queue.poll();ans[index++]=pre;//入度为0的节点是确保能够修完的先修课程,存到结果数组中。for(int cur : adjacency.get(pre)){//将每个待修课程的入度--if(--indegress[cur] == 0){queue.add(cur);//入度为0则入队}}}//最后的结果是入度均为0//如果说某个节点的入度 > 0 , 则说明不可能修完全部课程, 存在一个环。//如[[0,1],[1,0]]//这里无法找到一个入度为0的节点,存在一个环。for(int i = 0; i < indegress.length; i++){if(indegress[i] > 0)return new int[0];//返回一个空数组即可}//等价写法如下://如果说index不等于课程数量,则说明存在入度不为0的点,也就是环。// if(index != numCourses){// return new int[0];// } return ans;//返回结果数组}
}
看到这里的小伙伴,恭喜你又掌握了一个技能👊
希望大家能取得胜利,坚持就是胜利💪
我是寸铁!我们下期再见💕
往期好文💕
保姆级教程
【保姆级教程】Windows11下go-zero的etcd安装与初步使用
【保姆级教程】Windows11安装go-zero代码生成工具goctl、protoc、go-zero
【Go-Zero】手把手带你在goland中创建api文件并设置高亮
报错解决
【Go-Zero】Error: user.api 27:9 syntax error: expected ‘:‘ | ‘IDENT‘ | ‘INT‘, got ‘(‘ 报错解决方案及api路由注意事项
【Go-Zero】Error: only one service expected goctl一键转换生成rpc服务错误解决方案
【Go-Zero】【error】 failed to initialize database, got error Error 1045 (28000):报错解决方案
【Go-Zero】Error 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: YES)报错解决方案
【Go-Zero】type mismatch for field “Auth.AccessSecret“, expect “string“, actual “number“报错解决方案
【Go-Zero】Error: user.api 30:2 syntax error: expected ‘)‘ | ‘KEY‘, got ‘IDENT‘报错解决方案
【Go-Zero】Windows启动rpc服务报错panic:context deadline exceeded解决方案
Go面试向
【Go面试向】defer与time.sleep初探
【Go面试向】defer与return的执行顺序初探
【Go面试向】Go程序的执行顺序
【Go面试向】rune和byte类型的认识与使用
【Go面试向】实现map稳定的有序遍历的方式
相关文章:
【寸铁的刷题笔记】图论、bfs、dfs
【寸铁的刷题笔记】图论、bfs、dfs 大家好 我是寸铁👊 金三银四,图论基础结合bfs、dfs是必考的知识点✨ 快跟着寸铁刷起来!面试顺利上岸👋 喜欢的小伙伴可以点点关注 💝 🌞详见如下专栏🌞 &…...
vue2 + axios + mock.js封装过程,包含mock.js获取数据时报404状态的解决记录,带图文,超详细!!!
vue axios mock.js 以下是封装的过程,记录一下 1、首先先了解什么是mock.js的用途及特点 官网地址:Mock.js (mockjs.com) 作用:生成随机数据,拦截 Ajax 请求 优势: 2、了解axios的原理及使用 官网地址:…...
对象变更记录objectlog工具(持续跟新)
文章目录 前言演示代码演示环境引入项目项目框架操作步骤 设计介绍参考仓库 前言 系统基于mybatis-plus, springboot环境 对于重要的一些数据,我们需要记录一条记录的所有版本变化过程,做到持续追踪,为后续问题追踪提供思路。下面展示预期效果…...
平衡二叉树,二叉树的路径,左叶子之和
第六章 二叉树part04 今日内容: 110.平衡二叉树 257. 二叉树的所有路径 404.左叶子之和 110.平衡二叉树 (优先掌握递归) 给定一个二叉树,判断它是否是高度平衡的二叉树。 本题中,一棵高度平衡二叉树定义为&am…...
Sodinokibi勒索病毒最新变种,解密工具更新到2.0版本
Sodinokibi勒索病毒 Sodinokibi勒索病毒又称REvil,自从2019年6月1日,GandCrab勒索病毒运营团伙宣布停止运营之后,Sodinokibi勒索病毒马上接管了GandCrab的大部分传播渠道,同时它也被称为是GandCrab勒索病毒的“接班人”ÿ…...
css 鼠标移入放大的效果
效果 HTML <div class"img-wrap"><img class"img-item" src"../assets/1.png" alt"" srcset""></div> CSS <style lang"less" scoped> .img-wrap {/* 超出隐藏 */overflow: hidden;.img-…...
Transformer模型分布式并行通信量浅析
1.数据并行DP(朴素数据并行,Zero数据并行之后补充) O ( h 2 ∗ l ) O(h^2*l) O(h2∗l) 每台机器做完自己的梯度后需要做一次All reduce操作来累积梯度,故一个batch计算发送的数据量为每层梯度大小 h 2 h^2 h2乘以层数 l l l 优点…...
PMP考试之20240304
1.一家食品公司正在使用预测型方法开发一种新产品,该产品目前正处于测试阶段。鉴于测试反馈的性质,项目经理决定使用迭代方法。在其中一个迭代结束时,颁布了与该产品有关的新法规。项目经理接下来应该做什么? A.就项目的范围提出…...
智慧城市中的公共服务创新:让城市生活更便捷
目录 一、引言 二、智慧城市公共服务创新的实践 1、智慧交通系统 2、智慧医疗服务 3、智慧教育系统 4、智慧能源管理 三、智慧城市公共服务创新的挑战 四、智慧城市公共服务创新的前景 五、结论 一、引言 随着信息技术的迅猛发展,智慧城市已成为现代城市发…...
bert 相似度任务训练完整版
任务 之前写了一个相似度任务的版本:bert 相似度任务训练简单版本,faiss 寻找相似 topk-CSDN博客 相似度用的是 0,1,相当于分类任务,现在我们相似度有评分,不再是 0,1 了,分数为 0-5,数字越大…...
Ribbon实现Cloud负载均衡
安装Zookeeper要先安装JDK环境 解压 tar -zxvf /usr/local/develop/jdk-8u191-linux-x64.tar.gz -C /usr/local/develop 配置JAVA_HOME vim /etc/profile export JAVA_HOME/usr/local/develop/jdk1.8.0_191 export PATH$JAVA_HOME/bin:$PATH export CLASSPATH.:$JAVA_HOM…...
【UE 材质】制作加载图案(2)
在上一篇(【UE 材质】制作加载图案)基础上继续实现如下效果的加载图案 效果 步骤 1. 复制一份上一篇制作的材质并打开 2. 添加“Floor”节点向下取整 除相同的平铺数 此时的效果如下 删除如下节点 通过“Ceil”向上取整,参数“Tiling”默认…...
为啥要用C艹不用C?
在很多时候,有人会有这样的疑问 ——为什么要用C?C相对于C优势是什么? 最近两年一直在做Linux应用,能明显的感受到C带来到帮助以及快感 之前,我在文章里面提到环形队列 C语言,环形队列 环形队列到底是怎么回…...
Java:JVM基础
文章目录 参考JVM内存区域程序计数器虚拟机栈本地方法栈堆方法区符号引用与直接引用运行时常量池字符串常量池直接内存 参考 JavaGuide JVM内存区域 程序计数器 程序计数器是一块较小的内存空间,可以看做是当前线程所执行的字节码的行号指示器,各线程…...
JavaSec 基础之五大不安全组件
文章目录 不安全组件(框架)-Shiro&FastJson&Jackson&XStream&Log4jLog4jShiroJacksonFastJsonXStream 不安全组件(框架)-Shiro&FastJson&Jackson&XStream&Log4j Log4j Apache的一个开源项目,是一个基于Java的日志记录框架。 历史…...
python类的属性、方法、静态方法、静态方法类内部的调用、直接调用与实例化调用
设计者:ISDF工软未来 版本:v1.0 日期:2024/3/4 class Restaurant:餐馆类def __init__(self,restaurant_name,cuisine_type):#类的属性self.restaurant_name restaurant_nameself.cuisine_type cuisine_type# self.stregth_level 0def desc…...
haproxy集成国密ssl功能[下]
上接[haproxy集成国密ssl功能上 4. 源码修改解析 以下修改基本围绕haproxy的ssl_sock.c进行修改来展开的,为了将整个实现逻辑能够说明清楚,下述内容有部分可能就是直接摘抄haproxy的原有代码没有做任何修改,而大部分增加或者修改的内容则进行了特别的说明。 4.1 为bind指令…...
C++自学精简实践教程
一、介绍 1.1 教程特点 一篇文章从入门到就业有图有真相,有测试用例,有作业;提供框架代码,作业只需要代码填空规范开发习惯,培养设计能力 1.2 参考书 唯一参考书《C Primer 第5版》参考书下载: 蓝奏云…...
每日一题——LeetCode1572.矩阵对角线元素的和
方法一 遍历矩阵 如果矩阵中某个位置(x,y)处于对角线上,那么这个位置必定满足: xy 或 xy len-1 (len为矩阵长度) var diagonalSum function(mat) {let len mat.length;let sum 0;for (let i 0; i …...
mysql 常用命令练习
管理表格从表中查询数据从多个表查询修改数据sql变量类型 管理表格 创建一个包含三列的新表 CREATE TABLE products (id INT,name VARCHAR(255) NOT NULL,price INT DEFAULT 0,PRIMARY KEY(id) // 自增 ); 从数据库中删除表 DROP TABLE product; 向表中添加新列 ALTER TAB…...
Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...
使用分级同态加密防御梯度泄漏
抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...
ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...
【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问(基础概念问题) 1. 请解释Spring框架的核心容器是什么?它在Spring中起到什么作用? Spring框架的核心容器是IoC容器&#…...
DeepSeek源码深度解析 × 华为仓颉语言编程精粹——从MoE架构到全场景开发生态
前言 在人工智能技术飞速发展的今天,深度学习与大模型技术已成为推动行业变革的核心驱动力,而高效、灵活的开发工具与编程语言则为技术创新提供了重要支撑。本书以两大前沿技术领域为核心,系统性地呈现了两部深度技术著作的精华:…...
Vue3中的computer和watch
computed的写法 在页面中 <div>{{ calcNumber }}</div>script中 写法1 常用 import { computed, ref } from vue; let price ref(100);const priceAdd () > { //函数方法 price 1price.value ; }//计算属性 let calcNumber computed(() > {return ${p…...
Java后端检查空条件查询
通过抛出运行异常:throw new RuntimeException("请输入查询条件!");BranchWarehouseServiceImpl.java // 查询试剂交易(入库/出库)记录Overridepublic List<BranchWarehouseTransactions> queryForReagent(Branch…...
python打卡第47天
昨天代码中注意力热图的部分顺移至今天 知识点回顾: 热力图 作业:对比不同卷积层热图可视化的结果 def visualize_attention_map(model, test_loader, device, class_names, num_samples3):"""可视化模型的注意力热力图,展示模…...
