当青训营遇上码上掘金 - 寻友之路

63 阅读2分钟

非常开心参加此次的 [青训营 X 码上掘金] 主题创作活动,因为自己学习的是后端方向,所以更偏向于在主题三、四之间选择,思考后决定选择“寻友之路”这个主题,以下是我的一些创造过程:

题目介绍


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

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

创作历程


在对此题进行初步思考后,我第一反应是此题非常简单,不用什么算法,仅仅是一些判断循环语句就可以完成,觉得自己的思考不是很深,所以去搜索了已发布的一些文章,了解到了此题不像表面上那么简单,需要考虑多种情况,最终选择了二分法来解决此题

解题思路


移动主要可以分为两种情况:

第一种:1. 当N>=K即小青在小码右边的时候,由于公交车不能往左走,小青只能采用步行的方式前往小码家,故返回N-K if N > K { time = N - K }

第二种:当N小于K时,小青为N,小码的位置为K。如果N在K/2和K之间,那N只能到K位置,或者到K/2位置。对于每一次决策,计算之用步行所耗费的时间以及坐一次公交再用步行的时间。进行对比。到K/2的代价为N-K/2+1(K若为奇数则再加1),到K的代价为K-N。假设N<K/2,那么判定的区间就为K/4到K/2之间,再进行判断。最后获得的答案基础上再加上公交车的时间

具体实现代码如下: