寻找小码的路 | 「青训营 X 码上掘金」主题创作

简介: 寻找小码的路 | 「青训营 X 码上掘金」主题创作

前言

能加入到这届的青训营我十分的开心,更希望自己不仅能通过这次的青训营之旅丰富自己的阅历之余,还能够认识到更多的学习伙伴。最后通过快乐写码分享讲解我创作灵感和过程的同时,也希望大家可以及时纠正我的错误,伴我学习。

任务介绍

小青要找小码去玩,他们的家在一条直线上,当前小青在地点 N ,小码在地点 K (0≤N , K≤100 000),并且小码在自己家原地不动等待小青。小青有两种交通方式可选:步行和公交。 步行:小青可以在一分钟内从任意节点 X 移动到节点 X-1 或 X+1 公交:小青可以在一分钟内从任意节点 X 移动到节点 2×X (公交不可以向后走)

请帮助小青通知小码,小青最快到达时间是多久? 输入: 两个整数 N 和 K 输出: 小青到小码家所需的最短时间(以分钟为单位)

任务分析

通过对题目的解读,不难看出这是一个求从起点N到终点K的最短路径的问题,可以使用宽度优先搜索算法BFS进行解题。

宽度优先搜索算法的搜索步骤一般是:

(1)从队列头取出一个结点,检查它按照扩展规则是否能够扩展,如果能则产生一个新结点。

(2)检查新生成的结点,看它是否已在队列中存在,如果新结点已经在队列中出现过,就放弃这个结点,然后回到第(1)步。否则,如果新结点未曾在队列中出现过,则将它加入到队列尾。

(3)检查新结点是否目标结点。如果新结点是目标结点,则搜索成功,程序结束;若新结点不是目标结点,则回到第(1)步,再从队列头取出结点进行扩展。

任务设计

假设小青起点N为节点N,并使用一个双端队列来实现宽度优先搜索算法,接着使用一个set来记录已经访问过的节点,这样就可以避免重复访问已经访问过的节点,由此来提高效率。

在这里,我假设小青和小码的位置关系为 N < K,代码中的边界条件也是基于此假设而设置的。如果你需要处理 N > K 的情况,需要对代码进行相应的修改。

另外,在这个问题中,如果起点和终点之间不存在路径,则返回 -1。

最后,这段代码的复杂度为 O(K),因为只需要遍历K个节点即可找到终点,并且由于使用了set来判重,所以不存在重复便利相同节点的情况。

from collections import deque
def shortest_path(N, K):
    queue = deque([(N, 0)])
    visited = set()
    while queue:
        node, step = queue.popleft()
        if node == K:
            return step
        if node not in visited:
            visited.add(node)
            if node - 1 >= 0:
                queue.append((node - 1, step + 1))
            if node + 1 <= K:
                queue.append((node + 1, step + 1))
            if node * 2 <= K:
                queue.append((node * 2, step + 1))
    return -1
if __name__ == '__main__':
   n, k = map(int, input("请输入小青和小码的位置:").split())
   print("最短时间是:",shortest_path(n, k),"分钟")


总结

通过这次的解题,我认为这道题目也可以使用递归来实现宽度优先搜索算法,每一层的递归可以看作为一层的BFS,但考虑到递归是一种比较耗费时间的算法,对于量较大的数据,可能会导致超时,所以我暂时没用尝试使用递归进行解题。

写文章不易,如果你觉得文章对你有帮助,麻烦点一下点赞、收藏,你的支持是我写文章的最大动力!

最后,希望通过这次的讲解创作灵感和过程,能让掘友们看到对于这个主题的不一样的解法,也希望掘友们可以及时纠正我的错误。


目录
相关文章
|
11月前
|
算法 Linux C语言
【我的创作之路】CSDN陪我走过的256个日夜
【我的创作之路】CSDN陪我走过的256个日夜
142 0
|
机器学习/深度学习 人工智能 监控
DayDayUp:7月25日,如何打造技术品牌影响力?顶级大咖独家传授—阿里云乘风者计划专家博主&CSDN TOP1“一个处女座程序猿”《我是如何通过写作成为百万粉丝博主的?》演讲全文回顾
DayDayUp:7月25日,如何打造技术品牌影响力?顶级大咖独家传授—阿里云乘风者计划专家博主&CSDN TOP1“一个处女座程序猿”《我是如何通过写作成为百万粉丝博主的?》演讲全文回顾 目录 个人简介 一、什么内容是受欢迎的写作内容? 1.1、学生(计算机相关)群体 1.2、同行(开发者)群体 1.3、好内容的特点 二、一些经典的技术文章逻辑框架设计 2.1、从写作逻辑和结构角度考虑 (1)、对于bug类型的文章——通过分析刨根问底 (2)、对于学习类型的文章—通过案例学以致用 (3)、对于总结类型的文章—通过思考产生共鸣 2.2、从写作技巧考虑 (1)、题目和摘要必须简单、清晰明了且定位
DayDayUp:7月25日,如何打造技术品牌影响力?顶级大咖独家传授—阿里云乘风者计划专家博主&CSDN TOP1“一个处女座程序猿”《我是如何通过写作成为百万粉丝博主的?》演讲全文回顾
|
中间件
「技术人生」专栏作者来直播间啦!欢迎来提问
4月7日(下周四)15:00,技术人生专栏作者 贺科学(晨末)将在阿里巴巴中间件视频号与读者们现场互动,据说还带来了诚意满满的惊喜~
518 1
「技术人生」专栏作者来直播间啦!欢迎来提问
|
数据采集 移动开发 缓存
坚持写一年的技术博客, 我收获了这些 | 掘金年度征文
在技术平台写文章差不多一年了, 累计写了150多篇, 基本涵盖了前端的每一个角落, 也是笔者4年工作中的实践和学习积累. 中间踩过很多坑, 也从中积累了很多解决问题的方法和思路. 虽然牺牲了很多业余时间, 但也给我带来了很多收获. 笔者将利用2020年的最后几天, 好好回顾一下这一年的学习和坚持写作的收获.
156 0
|
程序员 图形学 芯片
掘金收割机的年终总结,我用 Three.js 创建了一个"掘金城市" | 2021年终总结征文
我叫大帅,一个老程序猿。本文会在评论中抽一个幸运鹅获得掘金周边鼠标垫1份
264 0
掘金收割机的年终总结,我用 Three.js 创建了一个"掘金城市" | 2021年终总结征文
|
程序员
话题打卡留言,每日精选10条,大家一起成长!
公众号发起了话题思考打卡赠书活动!然后有位读者建议,把每天打卡优秀的话题思考的留言整理出来,让大家能在最短的时间内看到大家最精彩的留言 。我也觉得这建议非常好,所以小猿就采用了 。以后公众号的次条推文,都是昨日打卡留言最优秀的10条精华 。
137 0
|
安全 大数据 程序员
聚能聊每周精选 第十四期
1.数据安全话题其实已经是老生常谈,随着大数据时代的到来,数据和敏感信息问题越来越多,同时也越来越被个人、企业乃至国家所重视。2.程序员的工作和日常生活非常的枯燥,但强烈的好奇心和学习精神是一个程序员的秘密武器,它是程序员们永攀高峰的源泉和动力所在。
3170 0
聚能聊每周精选 第十四期
|
大数据 分布式数据库 数据库
云栖专辑 | 阿里开发者们的20个感悟,一通百通
2018年12月20日,云栖社区3岁。阿里巴巴常说“晴天修屋顶”,所以我们特别制作了这个专辑——分享给开发者们20个阿里故事,50本书籍。
267498 0
|
Java 程序员 Spring
聚能聊每周精选 第十五期
Hello! 各位社区小伙伴们!好久不见!“爱你就像,蓝天白云,晴空万里,突然暴风雨。”接下来,让我们一起回顾一下,本周都有哪些热议的话题?各位聊主与粉丝们又有哪些精彩的互动?他们之间又碰撞出了怎样的火花? .
3301 0
聚能聊每周精选 第十五期
|
程序员 UED
聚能聊每周精选 第十一期
各位社区小伙伴大家!让大家久等了,大家不要见怪啊!话不多说接下来我们来看看最近聚能聊里各位聊主和各位粉丝们又有哪些精彩互动,碰撞出怎样的火花,一起来回顾一下吧!!
4725 0
聚能聊每周精选 第十一期