代码随想录图论

news/2024/5/17 18:22:19

1. 所有可能的路径

class Solution:def allPathsSourceTarget(self, graph: List[List[int]]) -> List[List[int]]:def dfs(graph, result, path, root):     #result 返回结果, path记录路径, root记录遍历到了第几个节点if root == len(graph) - 1:          #如果遍历到最后一个节点,记录结果并返回result.append(path.copy())      returnfor i in graph[root]:               #遍历每个节点下一个能到的下一个节点path.append(i)                  #path直接添加dfs(graph, result, path, i)     #dfs递归, 输入的root直接变成i,也就是当前遍历的下一个path.pop()                      #回溯result = []path = [0]                              #初始化的时候path里已经有最初始的节点位置root = 0                                #起始节点为0dfs(graph, result, path, root)return result

实际上就是回溯算法,区别在于:之前做的回溯的题目一般是列表里面一个一个元素遍历,所以在递归的时候有一个start_index变量,控制选与不选当前元素。

而dfs搜索找下一个节点的时候,不用一个个遍历graph中的节点,而是只需要遍历当前节点能到达的节点,因为如果当前节点都到不了的节点,就没有必要往后遍历了。

因此递归的dfs的输入就变成了当前遍历的节点i

2. 岛屿数量

广搜 bfs版本

class Solution:def __init__(self):self.dir = [(0, 1), (1, 0), (0, -1), (-1, 0)]self.count = 0def bfs(self, grid, visited, x, y):                                                     #广搜函数定义from collections import deque   queue = deque()                                                                     #初始化队列queue.append((x, y))                                                                #加入起始节点visited[x][y] = True                                                                #标记起始节点为已访问while queue:                                                                        #队列不为空进入循环curx, cury = queue.popleft()                                                    #取头节点for dx, dy in self.dir:                                                         #遍历四个方向nextx ,nexty = curx + dx, cury + dy                                     if nextx < 0 or nextx >= len(grid) or nexty < 0 or nexty >= len(grid[0]):   #越界就跳过continueif grid[nextx][nexty] == "0":                                               #如果本题中是海水也跳过continueif not visited[nextx][nexty]:                                               #把所有陆地标记为已访问queue.append((nextx, nexty))visited[nextx][nexty] = Truedef numIslands(self, grid: List[List[str]]) -> int:visited = [[False] * len(grid[0]) for _ in range(len(grid))]                        #初始化访问数组for i in range(len(grid)):for j in range(len(grid[0])):                                                   #遍历gridif visited[i][j] == False and grid[i][j] == "1":                            #如果节点没被访问过以及是陆地self.count += 1                                                         #计数+1self.bfs(grid, visited, i, j)                                           #深搜一下把当前节点连通的所有陆地都标记为已访问return self.count

3. 岛屿最大面积

class Solution:def maxAreaOfIsland(self, grid: List[List[int]]) -> int:def bfs(grid, visited, x, y):from collections import deque                           q = deque()                                                 #初始化队列q.append((x, y))                                            #加入起点visited[x][y] = True                                        #标记已遍历起点cnt = 1                                                     #记录岛屿大小direction = [(-1, 0), (0, -1), (1, 0), (0, 1)]              #四个方向while(q):                                                   #循环遍历队列中的节点curx, cury = q.popleft()                                #取出第一个节点for dx, dy in direction:                                #遍历四个方向nextx, nexty = curx + dx, cury + dyif nextx < 0 or nextx >= len(grid):                 #越界直接跳过continueif nexty < 0 or nexty >= len(grid[0]):continueif grid[nextx][nexty] == 0:                         #不是岛屿也直接跳过continueif not visited[nextx][nexty]:                       #是岛屿的部分q.append((nextx, nexty))                        #加入节点visited[nextx][nexty] = True                    #标记为已访问cnt += 1                                        #面积加1return cnt                                                  #返回当前起点的岛屿大小result = 0visited = [[False] * len(grid[0]) for _ in range(len(grid))]for i in range(len(grid)):                                      #遍历网格for j in range(len(grid[0])):                                 if not visited[i][j] and grid[i][j] == 1:               #让每个是岛屿的节点并且没被访问过的点作为起点去BFScur = bfs(grid, visited, i, j)                      #记录当前节点为起点的岛屿大小result = max(cur, result)                           #记录最大的岛屿大小return result


http://www.mrgr.cn/p/35182756

相关文章

上海法院诉讼自如电费欺诈维权一审胜诉 All In One

上海法院诉讼自如电费欺诈维权一审胜诉 All In One 依法维权上海法院诉讼自如电费欺诈维权一审胜诉 All In One依法维权作为一个法律新手,从阅读学习有关法律法规,收集证据,法律咨询, 立案申请,法院受理,整理提交证据, 法院开庭,法庭辩论, 历时几个月的努力和耐心等待,最…

5 步轻松上手,教你从 0 到 1 落地 Jmeter 接口自动化脚本!

Jmeter是进行接口测试的一款非常主流的工具,但绝大部分测试工程师,对于Jmeter接口测试脚本整理都是一知半解的。今天这篇文章,就以一个金融项目中接口为例,通过简单5步,教大家如何0代码编写Jmeter接口自动化脚本! 0、金融项目接口 1、登录接口信息2、新增投资项目接口信息…

sectigo怎么样,有哪些优势

SSL证书是Sectigo的核心服务之一。SSL&#xff0c;全称为安全套接层&#xff08;Secure Sockets Layer&#xff09;&#xff0c;它为网络通信提供加密服务&#xff0c;保障数据在传输过程中的安全性。在数字化交易和信息交换日益增长的当今时代&#xff0c;SSL证书几乎成为了所…

总结SQL相对常用的几个字符函数

目录 字符的截取 substr() trim()、ltrim()、rtrim() 字符串的拼接 ||、 字符的大小写转换 upper(column_name):大写 lower(column_name):小写 字符替换 replace() 搜索字符 instr(column_name, substring_to_find,start,n_appearence) charindex(substring_to_fi…

从IP网络到命名数据网络(NDN)简介

从IP网络到命名数据网络(NDN)简介由于科研需求,学习了解一下NDN相关技术。 由于本人的排版太菜了,本文还是由GPT-4排版+润色。 本文章用双拼完成,还在学习中。传统IP网络面临的挑战 IP网络的诞生 IP网络的概念最初是在20世纪70年代由美国国防部高级研究计划局(DARPA)提出…

【使用PADS软件将PCB由N(N2)层板改为2层板】

最近接触PADS软件比较多,相比Altium Designer来说,PADS软件操作更为繁琐,使用中遇到的一些问题,常常百度很久之后也找不到确切结果。。。 此文章记录将PCB由N(N>2)层板改为2层板的操作过程,实践无误,特此总结,希望对遇到相同困惑的朋友有所帮助~ ps:笔者使用的软件…

揭秘网红主播美颜工具:探秘美颜SDK的技术奥秘

在如今的网络直播平台上&#xff0c;越来越多的主播通过美颜工具来提升自己的形象&#xff0c;吸引更多的粉丝和观众。美颜技术的不断发展使得主播们能够在镜头前展现出更加完美的容颜&#xff0c;让观众眼前一亮。 一、美颜SDK的概念 美颜SDK&#xff0c;即美颜软件开发工具…

元宇宙VR虚拟线上展馆满足企业快速布展的需要

想要拥有一个VR线上虚拟展馆&#xff0c;展现您的城市风采或企业特色吗? 相比实体展馆搭建&#xff0c;VR线上虚拟展馆投入资金少&#xff0c;回报周期短&#xff0c;只需几个月的时间&#xff0c;您就能开始资金回笼。那么一个VR线上虚拟展馆多少钱呢? 深圳VR公司华锐视点基…

51单片机入门_江协科技_29~30_OB记录的自学笔记_DS18B20温度传感器

29. DS18B20温度传感器 29.1. DS18B20介绍 •DS18B20是一种常见的数字温度传感器&#xff0c;其控制命令和数据都是以数字信号的方式输入输出&#xff0c;相比较于模拟温度传感器&#xff0c;具有功能强大、硬件简单、易扩展、抗干扰性强等特点 •测温范围&#xff1a;-55C 到 …

ImageJ软件使用教程(三):目标计数

目录多点工具法阀值分割法二值化填充分割自动计数显示结果总结参考资料 本文以钢筋计数为例,讲解一下如何使用ImageJ软件进行计数,这里只介绍两种方法:多点工具法 阀值分割法钢筋计数是我接触的第一个视觉项目,虽然项目最后不了了之,但作为我机器视觉的开荒项目还是很有纪…

软考135-上午题-【软件工程】-软件配置管理

备注&#xff1a; 该部分考题内容在教材中找不到。直接背题目 一、配置数据库 配置数据库可以分为以下三类&#xff1a; (1) 开发库 专供开发人员使用&#xff0c;其中的信息可能做频繁修改&#xff0c;对其控制相当宽松 (2) 受控库 在生存期某一阶段工作结束时发布的阶段产…

NewTomNNT意大利杰诺牙科口腔CT图像分析处理软件

NNT软件的先进功能可以覆盖多个医学专业,特殊的重建窗口响应每个部门的不同需求。所有检查都完全兼容 DICOM 格式:它们可以通过 NNT 查看器共享或以 1:1 的比例打印。与 NewTom 采用的现代系统的出色连接性和集成性。工作流程、临床和诊断活动变得更加容易和高效。简单的 3D …

实验二 需求分析

五、绘制用例图 绘制小型网上书店顶层用例图:六、绘制类图 绘制用户登录模块类图:七、绘制状态图 绘制用户登录模块状态图:八、绘制顺序图 绘制“登录注册”模块的顺序图:九、绘制活动图 绘制“登录注册”模块的活动图:十、实验中遇到的问题及解决方法 1.问题:关于用例图之间的…

游戏前摇后摇Q闪E闪QE闪QA等操作

备注&#xff1a;未经博主允许禁止转载 个人笔记&#xff08;整理不易&#xff0c;有帮助&#xff0c;收藏点赞评论&#xff0c;爱你们&#xff01;&#xff01;&#xff01;你的支持是我写作的动力&#xff09; 笔记目录&#xff1a;学习笔记目录_pytest和unittest、airtest_w…

(内含福利)Meta 发布新开源模型 Llama 3;华为 Pura 70 系列一分钟售罄丨 RTE 开发者日报 Vol.188

最新人工智能模型、华为 Pura 70、月之暗面 Kimi 开发者朋友们大家好:这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real Time Engagement) 领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章…

实验二:用户需求分析

一、实验题目 :需求分析 二、实验目的 1、掌握StarUML软件的安装; 2、掌握利用StarUML工具分析、设计、绘制用例图; 3、掌握利用StarUML工具分析、设计、绘制类图; 4、掌握利用StarUML工具分析、设计、绘制状态图; 5、掌握利用StarUML工具分析、设计、绘制顺序图。 6、掌握…

将 Notepad++ 添加到右键菜单

目录 方式一&#xff1a;添加注册表&#xff08;手动&#xff09; 方式二&#xff1a;添加注册表&#xff08;一键添加&#xff09; 有时安装了notepad后&#xff0c;在txt文件上右键&#xff0c;在弹出的菜单栏中没有【通过 Notepad 打开】&#xff0c;如下&#xff1a; 这…

vue2使用vue-pdf实现pdf分页预览及缩放

1. 安装依赖npm install --save vue-pdf2. 在需要的页面,引入插件import pdf from vue-pdf3. 组件封装完整代码展示 应用:<template><pdf-viewer:srcList="Url"style="width: 150px; height: 100px"></pdf-viewer> </template>…

fopen/fwrite/fread/open/write/read的区别

fopen和Open,read和fread,write和fwrite有什么区别,很多人都会弄混了,而这经常会带来一些问题。所以在这里理清他们的关系是很有必要的。 open/read/write是Linux提供的系统调用,用户态的程序只能通过这些接口来访问文件系统层。而fopen/fread/fwrite是C库提供的文件读写接…

实验二:需求分析

一、实验题目 :需求分析 **二、实验目的 ** 1、掌握StarUML软件的安装; 2、掌握利用StarUML工具分析、设计、绘制用例图; 3、掌握利用StarUML工具分析、设计、绘制类图; 4、掌握利用StarUML工具分析、设计、绘制状态图; 5、掌握利用StarUML工具分析、设计、绘制顺序图。 6…