代码随想录图论

ops/2024/12/23 4:24:30/

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.ppmy.cn/ops/1808.html

相关文章

github上的软件许可证是什么?如何合并本地的分支德语难学还是俄语更加难学?站在一个中国人的立场上,德语难学还是俄语更加难学?俄语跟德语有什么样的显著差别?

目录 github上的软件许可证是什么&#xff1f; 如何合并本地的分支 德语难学还是俄语更加难学&#xff1f; 站在一个中国人的立场上&#xff0c;德语难学还是俄语更加难学&#xff1f; 俄语跟德语有什么样的显著差别&#xff1f; github上的软件许可证是什么&#xff1f; …

windows本地运行dreamtalk踩坑总结

dreamtalk是一个语音图片转视频的一个工具&#xff0c;就是给一段语音加一个头像图片&#xff0c;然后生成一段头像跟语音对口型的视频&#xff0c;其实还是很有意思的&#xff0c;最近阿里发布了一个类似的模型&#xff0c;但是还没开源&#xff0c;从展示视频看&#xff0c;阿…

云轴科技ZStack助力上银基金余额宝TA系统快速上线

上银基金管理有限公司&#xff08;上银基金&#xff09;通过ZStack Cloud云平台ZStack分布式存储融合架构构建关键余额宝TA系统&#xff08;开放式基金登记过户系统 &#xff09;实现业务快速如期上线。上银基金不仅可以借助ZStack云平台实现VMware纳管迁移&#xff0c;支持双机…

【Git】Git的安装与常用命令

Git的安装与常用命令 一、Git的安装 &#xff08;一&#xff09;下载 官网下载&#xff1a;https://git-scm.com/downloads 镜像网站&#xff1a;https://registry.npmmirror.com/binary.html?pathgit-for-windows/ &#xff08;二&#xff09;安装 双击安装&#xff0c…

青少年学好Python的注意事项

在当今数字化时代&#xff0c;计算机编程已经成为一项至关重要的技能&#xff0c;而Python作为一种简单易学的编程语言&#xff0c;越来越受到青少年的青睐。对于那些希望掌握编程技能的青少年来说&#xff0c;学好Python是一个很好的起点。然而&#xff0c;要想学好Python&…

【蓝桥杯嵌入式】蓝桥杯嵌入式第十四届省赛程序真题,真题分析与代码讲解

&#x1f38a;【蓝桥杯嵌入式】专题正在持续更新中&#xff0c;原理图解析✨&#xff0c;各模块分析✨以及历年真题讲解✨都已更新完毕&#xff0c;欢迎大家前往订阅本专题&#x1f38f; &#x1f38f;【蓝桥杯嵌入式】蓝桥杯第十届省赛真题 &#x1f38f;【蓝桥杯嵌入式】蓝桥…

Java刷题API

因为经常用Java刷题&#xff0c;记录一下常用到的API 数组 1. 定义&#xff08;两种方法&#xff09; type arrayName[]; //第一种 type[] arrayName; //第二种//eg int arrayName[] new int[5]; int[] arrayName new int[5];//二维数组 int arrayName[][] new int[5][5]…

阿里云Centos7下编译glibc

编译glibc 原来glibc版本 编译前需要的环境: CentOS7 gcc 8.3.0 gdb 8.3.0 make 4.0 binutils 2.39 (ld -v) python 3.6.8 其他看INSTALL, 但有些版本也不易太高 wget https://mirrors.aliyun.com/gnu/glibc/glibc-2.37.tar.gz tar -zxf glibc-2.37.tar.gz cd glibc-2.37/ …