当青训营遇上码上掘金
题目要求我们求出小青从地点 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
}
完整代码如下