寻找小码的路 | 「青训营 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,但考虑到递归是一种比较耗费时间的算法,对于量较大的数据,可能会导致超时,所以我暂时没用尝试使用递归进行解题。

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

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


目录
相关文章
|
算法 Linux C语言
【我的创作之路】CSDN陪我走过的256个日夜
【我的创作之路】CSDN陪我走过的256个日夜
163 0
|
6月前
|
开发者
第十一期乘风伯乐活动开启,快来推荐你身边热爱分享的技术达人吧
乘风伯乐奖,面向阿里云开发者社区已入驻乘风者计划的博主(技术/星级/专家),邀请用户入驻乘风者计划即可获得乘风者定制周边等实物奖励。本期面向阿里云开发者社区寻找100位乘风伯乐,邀请人数月度TOP 1 获奖者(大于108人)可获得cherry樱桃MX3.0S键盘及伯乐之星证书!
1954 172
第十一期乘风伯乐活动开启,快来推荐你身边热爱分享的技术达人吧
|
算法 搜索推荐 Java
我的创作纪念日:一位大学生Java技术创作者的自述
机缘 作为一个软件工程专业的学生,我对编程一直怀有浓厚的兴趣。然而,我的创作之路始于一次偶然的机会。 在我第一次接触Java编程的时候,我就被它的强大功能和灵活性深深吸引。我投入大量的时间和精力去学习,熬夜看教程,反复练习,一步步掌握Java编程的技巧。然而,我发现,虽然我已经掌握了许多知识,但是我还是经常会遇到一些问题,而这些问题在教科书上是找不到答案的。
71 0
|
机器学习/深度学习 人工智能 自然语言处理
系列征文3|算法领域主题征文开始啦!
阿里云开发者社区推出“算法技术征文挑战赛”。现面向社区所有开发者征集算法领域技术文章,可以是对算法思想的剖析,也可以是前沿算法的探索,只要你有干货,那就分享出来!在活动规定时间内前往阿里云开发者社区发文,就有机会获得空气炸锅、社区积分等丰富奖励,参与即可获奖,快来参加吧!
系列征文3|算法领域主题征文开始啦!
|
程序员 图形学 芯片
掘金收割机的年终总结,我用 Three.js 创建了一个"掘金城市" | 2021年终总结征文
我叫大帅,一个老程序猿。本文会在评论中抽一个幸运鹅获得掘金周边鼠标垫1份
293 0
掘金收割机的年终总结,我用 Three.js 创建了一个"掘金城市" | 2021年终总结征文
|
程序员
话题打卡留言,每日精选10条,大家一起成长!
公众号发起了话题思考打卡赠书活动!然后有位读者建议,把每天打卡优秀的话题思考的留言整理出来,让大家能在最短的时间内看到大家最精彩的留言 。我也觉得这建议非常好,所以小猿就采用了 。以后公众号的次条推文,都是昨日打卡留言最优秀的10条精华 。
168 0
|
安全 大数据 程序员
聚能聊每周精选 第十四期
1.数据安全话题其实已经是老生常谈,随着大数据时代的到来,数据和敏感信息问题越来越多,同时也越来越被个人、企业乃至国家所重视。2.程序员的工作和日常生活非常的枯燥,但强烈的好奇心和学习精神是一个程序员的秘密武器,它是程序员们永攀高峰的源泉和动力所在。
3190 0
聚能聊每周精选 第十四期
|
大数据 分布式数据库 数据库
云栖专辑 | 阿里开发者们的20个感悟,一通百通
2018年12月20日,云栖社区3岁。阿里巴巴常说“晴天修屋顶”,所以我们特别制作了这个专辑——分享给开发者们20个阿里故事,50本书籍。
267704 0
|
人工智能 运维 开发者
【云栖精选】帮你把握“金三银四”,阿里开发者招聘节面经总结帖来袭
云栖精选,一文为你网罗本周云栖社区本周精华帖,精彩不容错过。换工作、找实习,那你一定不能错过“金三银四”,想要来阿里巴巴,一些笔试和面试技巧一定不能少。本期中,为大家选取了几篇关于阿里招聘节的相关内容。
7439 0
|
新零售 架构师 Java
云栖专辑| 阿里毕玄:程序员的成长路线
阿里基础设施负责人毕玄结合自己的经历跟大家讲述了他在各个角色上成长的感受,值得所有正为职业发展而迷茫的技术同学细细品味。
24852 0
下一篇
无影云桌面