当青训营遇上码上掘金

60 阅读2分钟

当青训营遇上码上掘金~

题目

小青要找小码去玩,他们的家在一条直线上,当前小青在地点 N ,小码在地点 K (0≤N , K≤100 000),并且小码在自己家原地不动等待小青。
小青有两种交通方式可选:步行和公交。
步行:小青可以在一分钟内从任意节点 X 移动到节点 X-1 或 X+1
公交:小青可以在一分钟内从任意节点 X 移动到节点 2×X (公交不可以向后走)
请帮助小青通知小码,小青最快到达时间是多久?
输入: 两个整数 N 和 K
输出: 小青到小码家所需的最短时间(以分钟为单位)

解题思路

题目可以使用广度优先搜索的思路来解。具体来讲,从小青所在的地点开始,依次搜索小青可以到达的所有节点,直到找到小码所在的节点。
使用一个字典来存储每个节点的步数,然后使用双端队列来存储每个节点。
遍历每个节点的左右节点和公交节点加入队列,更新字典中对应节点的步数。
当检索到小码所在的节点时,返回步数值,以此表示小青到小码家的最短时间。
如果搜索完成但队列为空,表示没有找到小码所在的节点,此时应该异常处理。

代码结果展示

image.png 代码链接:FVZeGBmt - 码上掘金 (juejin.cn)

总结

广度优先搜索是一种枚举的方法是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型。Dijkstra单源最短路径算法和Prim最小生成树算法都采用了和宽度优先搜索类似的思想。其思路简单但时间和空间资源消耗大,时间复杂度为 O(N),空间复杂度也为 O(N)。