「青训营 X 码上掘金」主题 3:寻友之旅

49 阅读2分钟

当青训营遇上码上掘金

最近,非常高兴参加字节跳动举办的青训营活动,在里边学习到了很多知识。分享一道很有意思的算法题。

题目如下:

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

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

思路

本题有三种移动方式,左移一步、右移一步、移动到下标 * 2的地方。

首先,可以考虑使用广度优先搜索(bfs)来解决问题。通过使用队列(queue)来维护小青最新的位置,通过步行或公交车两种方式来到达小码家。

获取到n和k,也就是小青家和小码家的初始位置后,需要做一下判断,大概分为三种情况考虑该问题:

  1. 如果小青家在小码家右边,故只能步行,直接返回n - k即可。(公交车只能向右行驶,不能回头)

  2. 如果小青家和小码家的位置一样,直接返回0即可。

  3. 小青家在小码家左边,这种情况是需要用到bfs递归。

可以先用一个boolean数组来记录每个位置是否被访问过,以cur为参数传入bfs方法中作为初始距离,将cur入队,每次弹出cur并判断是否等于target,如果不是target,就在boolean数组中标记已经访问过。