「青训营 X 码上掘金」—— 寻友之旅

55 阅读2分钟

当青训营遇上码上掘金

题目要求我们求出小青从地点 N 到小码的家在地点 K 的最短时间,小青有两种交通方式可选:步行和公交。

通过思考可以发现,我们首先要考虑N、K的大小情况,K不动,N动

  • 如果N>K
    • 因为公交不能后退,所以只能采用步行的方式
    • 最短时间为:N-K
  • 如果N=K:则最短时间为0
  • 如果N<K:需要使用广度优先搜索(BFS)来解决,先搜索当前点的所有下一个点,再选择到达终点的最短路径。

广度优先搜索:广度优先搜索是一种图论搜索算法,它的基本思想是每次先搜索当前点的所有相邻点,再选择最短的一条路径继续搜索。

我们从起点开始,并将其入队,然后每次从队首取出一个点,并将其相邻的所有未访问过的点入队。我们用一个布尔数组记录每个点是否已访问,以避免重复访问。

当我们在队列中找到终点时,我们知道了从起点到终点的最短路径,即为从起点到终点所经过的所有点的数量减一。

代码中,我们使用一个队列维护已经访问但未扩展的点。对于每个从队首取出的点,我们扩展它的所有未访问的相邻点,并将其入队。当找到终点时,我们直接返回步数即可。

这里定义了一个名为 Queue 的结构体,其中包含了 data 字段,用来存储队列的数据。然后,我们实现了三个方法:

  • Push 方法:用来将数据入队,实现方式是使用 append 将元素添加到 slice 的末尾。
  • Pop 方法:用来从队列中取出元素,实现方式是先保存队列的第一个元素到 res 变量中,然后将 slice 的第一个元素删除并返回 res
  • Empty 方法:用来判断队列是否为空,实现方式是判断 data 字段的长度是否为 0。
type Queue struct {
    data []int // 用 slice 存储队列数据
}

func (q *Queue) Push(val int) {
    q.data = append(q.data, val)
}

func (q *Queue) Pop() int {
    if len(q.data) == 0 {
        panic("queue is empty")
    }
    res := q.data[0]
    q.data = q.data[1:]
    return res
}

func (q *Queue) Empty() bool {
    return len(q.data) == 0
}

完整代码如下