题目链接
给一个数组,以0为起点出发,经过一定决策的跳跃,问最短到达len-1位置的代价
每次跳跃代价1单位时间
你可以向相邻的位置跳跃,也可以跳到在数组中具有相同值的位置
注意任何时候不允许跳出数组
BFS解决即可
注意寻找下一步策略使用优于O(N)的方法解决,提高算法执行效率
使用Go的HashMap可以实现常数级的后继节点查找
开始搜索前需要预处理
Runtime: 1692 ms beats 33.3%
Memory Usage: 16.7 MB
func minJumps(arr []int) int {
type Node struct {
idx int
step int
}
l := len(arr)
dump := make([]bool, l)
table := make(map[int][]int)
for i, v := range arr { // 后继节点预处理
table[v] = append(table[v], i)
}
que := list.New()
que.PushBack(&Node{0, 0}) // 起点放进队列
dump[0] = true
var curr *Node
// BFS 开始
for que.Len() != 0 {
curr = que.Front().Value.(*Node)
que.Remove(que.Front())
// 到达了终点
if curr.idx == l - 1 {
return curr.step
}
// 遍历后继节点
for _, v := range table[arr[curr.idx]] {
if dump[v] {
continue
}
dump[v] = true
que.PushBack(&Node{v, curr.step + 1})
}
// 两个相邻节点移动的决策
if curr.idx >= 1 && !dump[curr.idx - 1] {
dump[curr.idx - 1] = true
que.PushBack(&Node{curr.idx - 1, curr.step + 1})
}
if curr.idx + 1 < l && !dump[curr.idx + 1] {
dump[curr.idx + 1] = true
que.PushBack(&Node{curr.idx + 1, curr.step + 1})
}
}
return 0
}