【算法——Python实现】无权图建模通过广度优先遍历解决问题
来源:互联网 发布:淘宝企业开店要交税吗 编辑:程序博客网 时间:2024/05/21 23:32
有些问题并非图相关问题,但可以通过抽象为图,建立模型,运用广度优先遍历求得一点到另外一点的最短路径,来解决问题
应用:
Leetcode 279. Perfect Squares
给出一个正整数n,寻找最少的完全平方数,使他们的和为n
如 12 = 4+4+4, 13 = 9 + 4
思路:
将从n到0的每个数字作为图中一个点,每两个数字之间如果相差一个完全平方数,则用一条边相连,如:
4 3 2 1 0 之间都相差1,1X1 = 1,所以两两之间用一条边相连,而4不仅和3相差1,4更和0相差4,2X2 = 4,所以4和0之间用一条边相连
基于此模型,再通过队列,通过广度优先遍历,这个问题就变成从n到0通过几条路径最短,且一定有解
import Queueclass Solution(object): def numSquares(self, n): """ :type n: int :rtype: int """ # 广度优先遍历,建模(无权图),每两个数字如果相差一个完全平方数则有一条边,求n到0的最短路径 if n < 0: return None q = Queue.Queue() q.put((n, 0)) # 第一个数字表示具体第几个数字,第二个数字表示经历了几段路径到达这个数字 visited = [False for _ in range(0, n)] # 记录每个数字是否已经被推入过队列 visited.append(True) # 广度优先遍历 while not q.empty(): info = q.get() num = info[0] step = info[1] i = 1 # num - (i*i) >= 0表示还有与num相连的边 while num - (i*i) >= 0: record = num - (i*i) if record == 0: return step + 1 # 防止大量重复数字被推入队列,之前已经推入过队列的数字说明有比当前更短的路径到达此数字,则跳过 if not visited[record]: q.put((record, step + 1)) visited[record] = True i += 1
阅读全文
0 0
- 【算法——Python实现】无权图建模通过广度优先遍历解决问题
- 第十二周项目3--图遍历算法实现--实现广度优先遍历——BFS
- 用邻接表实现图的深度优先遍历、广度优先遍历、最短路径(无权图)
- 第十二周项目三 图遍历算法实现——广度优先(BFS)遍历
- 第十一周项目3 — 图遍历算法实现 (2) 广度优先遍历
- 【算法——Python实现】无权图(稠密图、稀疏图)及图的遍历
- 图的广度优先遍历算法JAVA实现
- Java实现图的深度和广度优先遍历算法
- 深度、广度优先遍历算法C实现
- 深度、广度优先遍历算法C实现
- 图的遍历之深度优先搜索算法&&广度优先优先算法的实现
- 【算法学习】图相关算法编程实现-深度优先遍历和广度优先遍历
- 【算法学习】图相关算法编程实现-深度优先遍历和广度优先遍历
- 数据结构 — 图 之 广度优先遍历
- 图的广度优先遍历—C
- 图-无权图-广度优先查询(BFS)
- 数据结构与算法专题之图——图的遍历(深度优先遍历和广度优先遍历)
- 图算法:1、邻接表实现图的深度优先遍历,广度优先遍历
- 消失了快一年的 VR、AR,现在到底怎么样了?
- 平面设计师之路2——图像的裁剪与拼合还原
- 无根树转换成有根树
- PUTTY远程连接linux服务器,却报server refused to start a shell command
- TBS(腾讯浏览器服务)
- 【算法——Python实现】无权图建模通过广度优先遍历解决问题
- Spring容器高级主题
- Android数据加密
- Android Camera HAL3中预览preview模式下的控制流
- Python设计模式--适配器模式
- Java线程面试题(01) Java中如何检查一个线程是否拥特定对象的锁
- Android screen monitor
- Tomcat(64位)免安装版的环境安装与配置
- 用C#调用蓝牙编程