当前位置: 首页 > news >正文

LeetCode-2608. 图中的最短环【广度优先搜索 图,腾讯面试真题】

LeetCode-2608. 图中的最短环【广度优先搜索 图,腾讯面试真题】

  • 题目描述:
  • 解题思路一:【一图秒懂】枚举起点跑 BFS
  • 解题思路二:背诵版
  • 解题思路三:

题目描述:

现有一个含 n 个顶点的 双向 图,每个顶点按从 0 到 n - 1 标记。图中的边由二维整数数组 edges 表示,其中 edges[i] = [ui, vi] 表示顶点 ui 和 vi 之间存在一条边。每对顶点最多通过一条边连接,并且不存在与自身相连的顶点。

返回图中 最短 环的长度。如果不存在环,则返回 -1 。

环 是指以同一节点开始和结束,并且路径中的每条边仅使用一次。

示例 1:
在这里插入图片描述
输入:n = 7, edges = [[0,1],[1,2],[2,0],[3,4],[4,5],[5,6],[6,3]]
输出:3
解释:长度最小的循环是:0 -> 1 -> 2 -> 0

示例 2:
在这里插入图片描述
输入:n = 4, edges = [[0,1],[0,2]]
输出:-1
解释:图中不存在循环

提示:

2 <= n <= 1000
1 <= edges.length <= 1000
edges[i].length == 2
0 <= ui, vi < n
ui != vi
不存在重复的边

解题思路一:【一图秒懂】枚举起点跑 BFS

题解参考
在这里插入图片描述
问:为什么说发现一个已经入队的点,就说明有环?

答:这说明到同一个点有两条不同的路径,这两条路径组成了一个环。

class Solution:def findShortestCycle(self, n: int, edges: List[List[int]]) -> int:g = [[] for _ in range(n)]for x, y in edges:g[x].append(y)g[y].append(x) # 建图def bfs(start):ans = infdis = [-1] * n # dis[i] 表示从start到i的最短路径长度dis[start] = 0q = deque([(start, -1)])while q:x, fa = q.popleft()for y in g[x]:if dis[y] < 0: # 第一次遇到dis[y] = dis[x] + 1q.append((y, x))elif y != fa: # 第二次遇到ans = min(ans, dis[x] + dis[y] + 1)return ansans = min(bfs(i) for i in range(n))return ans if ans < inf else -1

时间复杂度:O(nm)
空间复杂度:O(n+m)

解题思路二:背诵版

class Solution:def findShortestCycle(self, n: int, edges: List[List[int]]) -> int:g = [[] for _ in range(n)]for u, v in edges:g[u].append(v)g[v].append(u)def bfs(start):ans = infdis = [-1] * nq = deque([(start, -1)])dis[start] = 0while q:x, fa = q.popleft()for y in g[x]:if dis[y] < 0:dis[y] = dis[x] + 1q.append((y, x))elif y != fa:ans = min(ans, dis[x] + dis[y] + 1)return ansans = min(bfs(i) for i in range(n))return ans if ans < inf else -1

时间复杂度:O(nm)
空间复杂度:O(n+m)

解题思路三:


时间复杂度:O(n)
空间复杂度:O(n)


创作不易,观众老爷们请留步… 动起可爱的小手,点个赞再走呗 (๑◕ܫ←๑)
欢迎大家关注笔者,你的关注是我持续更博的最大动力


原创文章,转载告知,盗版必究



在这里插入图片描述


在这里插入图片描述
♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠

http://www.lryc.cn/news/456019.html

相关文章:

  • IDEA 编译报错 “java: 常量字符串过长” 的解决办法
  • RK3568平台开发系列讲解(I2C篇)I2C 总线实现 client 设备方法
  • K8S安装和部署
  • Singleton(单例模式)
  • 【Linux报错】“-bash: cd: too many arguments“
  • C# WebService返回参数为DataTable报错“XML文档有错误”
  • [paddle]paddleseg快速开始
  • UNIAPP popper气泡弹层【unibest框架下】vue3+typescript
  • launcher.py: error: the following arguments are required: --output_dir
  • C语言基础之结构体
  • Redis入门第四步:Redis发布与订阅
  • MySQL 之权限与授权
  • 解决方案:Pandas里面的loc跟iloc,有什么区别
  • C# 和 C++ 混合编程
  • Vxe UI vue vxe-table 实现表格单元格选中功能
  • 组合模式详解
  • AltiumDesigner脚本开发-DIP封装制作
  • 乌班图基础设施安装之Mysql8.0+Redis6.X安装
  • 【动态规划-最长递增子序列(LIS)】力扣673.最长递增子序列的个数
  • SQL优化 where谓词条件is null优化
  • Starrocks 元数据恢复 failed to load journal type 10242
  • 《深度学习》神经语言模型 Word2vec CBOW项目解析、npy/npz文件解析
  • 黄粱一梦,镜花水月总是空
  • 【分布式事务-01】分布式事务之2pc两阶段提交
  • docker 安装 rabbitMQ
  • 知识改变命运 数据结构【java对象的比较】
  • 01_23 种设计模式之《简单工厂模式》
  • Android 12.0 关于定制自适应AdaptiveIconDrawable类型的动态日历图标的功能实现系列一
  • 【源码+文档+调试讲解】基于安卓的小餐桌管理系统springboot框架
  • C语言中的文件操作(二)