当青训营遇上码上掘金
主题 3:寻友之旅
小青要找小码去玩,他们的家在一条直线上,当前小青在地点 N ,小码在地点 K (0≤N , K≤100 000),并且小码在自己家原地不动等待小青。小青有两种交通方式可选:步行和公交。
步行:小青可以在一分钟内从任意节点 X 移动到节点 X-1 或 X+1
公交:小青可以在一分钟内从任意节点 X 移动到节点 2×X (公交不可以向后走)
请帮助小青通知小码,小青最快到达时间是多久?
输入: 两个整数 N 和 K
输出: 小青到小码家所需的最短时间(以分钟为单位)
题目分析
1.简单思考
可以考虑暴力的手段,暴力的手段就类似于穷举,这里就不做阐述了,时间复杂度较高
2.BFS思考
三种方法对应每个点伸出的三条边,可以看作一个图论问题求最短路,所以BFS和DFS都是可以的
BFS的思考方式如下,这里采取的实现方式是用数组模拟队列,创建两个数组,一个标记节点的访问状态,一个用来模拟队列,一个结构体Jump来记录节点状态,具有当前节点位置x,以及当前节点的最小步数mi
在刚开始时判断起始点和目标点是否重合,不重合则将起始点加入队列,重合则直接返回0
当队列不空时,首先取出队头元素,其次判断当前是否可以接触到目标点,若可以则返回当前队头元素所耗时间+1的数值,若不可以则按照x+1,x-1,x*2 的顺序依次判断,三个之间的判断顺序对结果应该是没有影响的,类比图论最短路,都是从当前点一步能到达的范围,每次循环步数范围逐渐扩大
下面是go的代码实现,这里直接设定了4,15进行验证,结果是3,路径为:4->8->16->15