当青训营遇上码上掘金
题目 3:寻友之旅
小青要找小码去玩,他们的家在一条直线上,当前小青在地点 N ,小码在地点 K (0≤N , K≤100 000),并且小码在自己家原地不动等待小青。小青有两种交通方式可选:步行和公交。
步行:小青可以在一分钟内从任意节点 X 移动到节点 X-1 或 X+1
公交:小青可以在一分钟内从任意节点 X 移动到节点 2×X (公交不可以向后走)
请帮助小青通知小码,小青最快到达时间是多久?
输入: 两个整数 N 和 K
输出: 小青到小码家所需的最短时间(以分钟为单位)
解题思路
直觉思考
- 当N>=K,即小青在小码右边的时候,由于规定公交车不能往左走,小青只能采用步行的方式向左前往小码家,所用时间是N-K。
- 当N<K,即小青在小码左边的时候,需要进行循环判断,跳出循环条件是N>=K,循环体内对步行和公交所用时间进行比较,如果walk >= bus 则这一次决策采取步行的方式,否则采取坐公交的方式
- walk = K - N
- bus = abs(K/2 - N) + 1 // note:+1是坐公交车耗费的1单位时间
- 注意需要考虑K为奇数时不能直接进行K/2的操作,先减一
- 所用时间+1
- 这里采用反向的方法解题,让靠右的小码K相对向小青移动,避免了越界问题
此外,也可以将题目抽象为图论问题,步行看作存在X连向X+1和X-1的有向边,公交看作存在X连向2X的有向边,边权都为1,求解最短路径,可考虑bfs广度优先算法和迪杰斯特拉算法,bfs因为此题不存在不同边权而相对于迪杰斯特拉算法整体的时间复杂度更优。