当青训营遇上码上掘金。
主题3:寻友之旅
小青要找小码去玩,他们的家在一条直线上,当前小青在地点 N ,小码在地点 K (0≤N , K≤100 000),并且小码在自己家原地不动等待小青。小青有两种交通方式可选:步行和公交。
步行:小青可以在一分钟内从任意节点 X 移动到节点 X-1 或 X+1
公交:小青可以在一分钟内从任意节点 X 移动到节点 2×X (公交不可以向后走)
请帮助小青通知小码,小青最快到达时间是多久?
输入: 两个整数 N 和 K
输出: 小青到小码家所需的最短时间(以分钟为单位)
代码片段
package main
import (
"container/list"
"fmt"
)
var f [100010]int
var s [100010]int
func Solution(n int, k int) int{
q := list.New()
f[n] = 1
s[n] = 0
q.PushBack(n)
for {
ele := q.Front()
c := int(ele.Value.(int))
if c-1>0 && f[c-1]==0 {
q.PushBack(c-1)
f[c-1]=1
s[c-1]=s[c]+1
}
if c+1<100010 && f[c+1]==0 {
q.PushBack(c+1)
f[c+1]=1
s[c+1]=s[c]+1
}
if c*2<100010 && f[c*2]==0 {
q.PushBack(c*2)
f[c*2]=1
s[c*2]=s[c]+1
}
if f[k]==1{
break
}
q.Remove(ele)
}
return s[k]
}
func main() {
var n,k int=5,17
min := Solution(n,k)
fmt.Println(min)
}
主要就是从小青出发点x开始,将x-1、x+1、x*2三个数值入队。这些点标记为已遍历,并且这三个点的移动时间为x的移动时间加1。然后当小码所在的点k也入队以后退出循环,k点的移动时间即是我们需要的结果
总结
这道题详细解题思路就不作讲解了,我觉得大部分大佬讲的肯定比我好很多。我就说说写这道题的感受吧。
在这一个月的学习以来,这次青训营给我感觉像是在网络上这片茫茫大海中寻找朋友。这里有许许多多的大佬,也有跟我一样零基础开始的萌新。我们的学习进度就像小青和小码之间的距离一样,我们要从N点进步到K点。每天的学习进度可能是加1,可能是减1,也可能是乘2(虽然我觉得一天的学习成果能让自己的能力翻一倍不太现实)。寒假已经即将结束,我也不知道有没有进步到预期中的K点,不过这次青训营对我来说,已经是一次十分新鲜的体验了。