当青训营遇上码上掘金,小青和小码的寻友之旅即将开始。让我们一起用代码的魅力帮助他们快速找到自己的朋友吧!
题目
小青要找小码去玩,他们的家在一条直线上,当前小青在地点 N ,小码在地点 K (0≤N , K≤100 000),并且小码在自己家原地不动等待小青。小青有两种交通方式可选:步行和公交。
步行:小青可以在一分钟内从任意节点 X 移动到节点 X-1 或 X+1
公交:小青可以在一分钟内从任意节点 X 移动到节点 2×X (公交不可以向后走)
请帮助小青通知小码,小青最快到达时间是多久?
输入: 两个整数 N 和 K
输出: 小青到小码家所需的最短时间(以分钟为单位)
思路
小青和小码的位置在同一条直线上,这里可以把二者想象成数轴上的两个点(N,0),(K,0)
我们需要研究小青到达小码家的距离,就需要明白其具体关系,从而进一步研究二者位置之间的最短距离,进而采用较为简短的代码实现。本题采用了广度优先搜索的思路实现具体的相关代码。
具体解题方法
从小青所在的位置开始,将其位置抽象为在同一条直线上的两个节点,从而依次搜索小青可以到达的所有节点,直到找到小码所在的节点,使用一个字典来存储每个节点的步数,随后使用双端队列来存储每个节点。对于每个节点,都将它的左右节点和公交节点加入队列,并更新字典中对应节点的步数。当我们找到小码所在的节点时,就可以返回它的步数(如果对应小青和小码的坐标一致,则其之间距离为0,为一种特殊情况),表示小青到小码家的最短时间。如果在搜索过程中队列为空,说明没有找到小码所在的节点,此时应该返回 -1。
相关代码片段
if queue_one + 1 <= 100000:
# 如果当前节点在队列,则跳出if语句
# 反之则将其加入
if queue_one + 1 not in steps:
queue.append(queue_one + 1)
step[queue_one + 1] = step[queue_one] + 1
parents[queue_one + 1] = queue_one
总结
在这次寻友之旅中,我们采用了广度优先搜索的思路简单实现了小青和小码的寻友之旅,共同见证了代码的无限魅力!!