-
Notifications
You must be signed in to change notification settings - Fork 1
/
jump_game_iv.go
59 lines (53 loc) · 1.38 KB
/
jump_game_iv.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
package leetcode
// BFS approach
// Time complexity: O(V) where V is the length of the array. The indices are considered the nodes of the graph
// Space complexity: O(V)
// Note: If we don't properly optimize it the complexity becomes O(V + E) where E could be V^2
// in the worst case where all the elements in the array except for the first and last
// are the same. It creates a graph where each node is connecte directly to every other one
func minJumps(arr []int) int {
if len(arr) == 1 {
return 0
}
N := len(arr)
adjList := make(map[int][]int)
for i, el := range arr {
if _, ok := adjList[el]; ok == false {
adjList[el] = make([]int, 0, 10)
}
adjList[el] = append(adjList[el], i)
}
deq := []int{0}
seen := make(map[int]bool)
seen[0] = true
res := 0
for len(deq) > 0 {
res += 1
newDeq := make([]int, 0, 10)
for _, node := range deq {
if _, ok := seen[node+1]; node < N-1 && ok == false {
if node+1 == N-1 {
return res
}
newDeq = append(newDeq, node+1)
seen[node+1] = true
}
if _, ok := seen[node-1]; node > 0 && ok == false {
newDeq = append(newDeq, node-1)
seen[node-1] = true
}
for _, nei := range adjList[arr[node]] {
if nei == N-1 {
return res
}
if _, ok := seen[nei]; ok == false {
newDeq = append(newDeq, nei)
seen[nei] = true
}
}
adjList[arr[node]] = nil
}
deq = newDeq
}
return -1
}