当青训营遇上码上掘金
主题介绍 ———【寻友之旅】
小青要找小码去玩,他们的家在一条直线上,当前小青在地点 N ,小码在地点 K (0≤N , K≤100 000),并且小码在自己家原地不动等待小青。小青有两种交通方式可选:步行和公交。
步行:小青可以在一分钟内从任意节点 X 移动到节点 X-1 或 X+1
公交:小青可以在一分钟内从任意节点 X 移动到节点 2×X (公交不可以向后走)
请帮助小青通知小码,小青最快到达时间是多久?
输入: 两个整数 N 和 K
输出: 小青到小码家所需的最短时间(以分钟为单位)
解题思路
整个题目解释为小青在一条长为K-N的路线上行走,可选步行或者公交这两种方式,步行一分钟移动1个点位,公交是跳跃式行走2X,所以行走时应该优先选择公交,当公交行走的两倍2X超过小码的位置时,判断一下原先位置到小码的位置Y与选择公交行走2X后的位置到小码的位置Z比较,如果Y大于Z,则先选择公交,再步行向后走,否则不选公交,直接步行向前走。
核心代码
func shortTime(n int64, k int64, count int64) int64 {
if n == k {
return count
}
if k > n && (2*n-k <= k-n) {
count = shortTime(2*n, k, count+1)
} else { // 这之后调用函数中参数n为k,步行
if k > n {
count = shortTime(k, k, count+(k-n))
} else {
count = shortTime(k, k, count+(n-k))
}
}
return count
}
注意:判断2n-k与k-n后不管结果如何,调用的n都等于k,因为之后都是直接算步行的分钟数了,直接算出来就可以。
运行结果
n = 2
k = 13