[青训营 X 码上掘金] 寻友之旅

63 阅读2分钟
当青训营遇上码上掘金。

主题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点,不过这次青训营对我来说,已经是一次十分新鲜的体验了。