主题3 “寻友之旅”
当青训营遇上码上掘金之“寻友之旅” 题干: 小青要找小码去玩,他们的家在一条直线上,当前小青在地点 N ,小码在地点 K (0≤N , K≤100 000),并且小码在自己家原地不动等待小青。
小青有两种交通方式可选:步行和公交。
1.步行:小青可以在一分钟内从任意节点 X 移动到节点 X-1 或 X+1
2.公交:小青可以在一分钟内从任意节点 X 移动到节点 2×X (公交不可以向后走)
请帮助小青通知小码,小青最快到达时间是多久?
输入: 两个整数 N 和 K 输出: 小青到小码家所需的最短时间(以分钟为单位)
思路:
-
当N>=K即小青在小码右边的时候,由于公交车不能往左走,小青只能采用步行的方式前往小码家,故返回N-K。
-
当N<K即小青在小码左边的时候,对于每一次决策,计算之用步行所耗费的时间以及坐一次公交再用步行的时间:
walk = K - N 和 bus = abs(K/2 - N) + 1 // 这里+1是坐公交车耗费的1单位时间
如果walk >= bus 则这一次决策采取步行的方式,否则采取坐公交的方式。
更新耗费时间step。
重复循环这一步骤,当N>=K的时候跳出循环,并且返回step的值。
具体代码实现如下:
测试用例以及结果如下图所示:
总结: 考虑到该题目的公交车只能单方向前进,一定程度减少额题目的情况的复杂性,故不采用高时间复杂度的广度优先遍历即bfs的方法去解题,取而代之的是采用反向(让靠右的小码相对地像小青移动,避免了越界的问题)的方法解题。