Description#
A certain bug's home is on the x-axis at position x
. Help them get there from position 0
.
The bug jumps according to the following rules:
- It can jump exactly
a
positions forward (to the right). - It can jump exactly
b
positions backward (to the left). - It cannot jump backward twice in a row.
- It cannot jump to any
forbidden
positions.
The bug may jump forward beyond its home, but it cannot jump to positions numbered with negative integers.
Given an array of integers forbidden
, where forbidden[i]
means that the bug cannot jump to the position forbidden[i]
, and integers a
, b
, and x
, return the minimum number of jumps needed for the bug to reach its home. If there is no possible sequence of jumps that lands the bug on position x
, return -1.
Example 1:
Input: forbidden = [14,4,18,1,15], a = 3, b = 15, x = 9
Output: 3
Explanation: 3 jumps forward (0 -> 3 -> 6 -> 9) will get the bug home.
Example 2:
Input: forbidden = [8,3,16,6,12,20], a = 15, b = 13, x = 11
Output: -1
Example 3:
Input: forbidden = [1,6,2,14,5,17,4], a = 16, b = 9, x = 7
Output: 2
Explanation: One jump forward (0 -> 16) then one jump backward (16 -> 7) will get the bug home.
Constraints:
1 <= forbidden.length <= 1000
1 <= a, b, forbidden[i] <= 2000
0 <= x <= 2000
- All the elements in
forbidden
are distinct. - Position
x
is not forbidden.
Solutions#
Solution 1#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| class Solution:
def minimumJumps(self, forbidden: List[int], a: int, b: int, x: int) -> int:
s = set(forbidden)
q = deque([(0, 1)])
vis = {(0, 1)}
ans = 0
while q:
for _ in range(len(q)):
i, k = q.popleft()
if i == x:
return ans
nxt = [(i + a, 1)]
if k & 1:
nxt.append((i - b, 0))
for j, k in nxt:
if 0 <= j < 6000 and j not in s and (j, k) not in vis:
q.append((j, k))
vis.add((j, k))
ans += 1
return -1
|
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
| class Solution {
public int minimumJumps(int[] forbidden, int a, int b, int x) {
Set<Integer> s = new HashSet<>();
for (int v : forbidden) {
s.add(v);
}
Deque<int[]> q = new ArrayDeque<>();
q.offer(new int[] {0, 1});
final int n = 6000;
boolean[][] vis = new boolean[n][2];
vis[0][1] = true;
for (int ans = 0; !q.isEmpty(); ++ans) {
for (int t = q.size(); t > 0; --t) {
var p = q.poll();
int i = p[0], k = p[1];
if (i == x) {
return ans;
}
List<int[]> nxt = new ArrayList<>();
nxt.add(new int[] {i + a, 1});
if ((k & 1) == 1) {
nxt.add(new int[] {i - b, 0});
}
for (var e : nxt) {
int j = e[0];
k = e[1];
if (j >= 0 && j < n && !s.contains(j) && !vis[j][k]) {
q.offer(new int[] {j, k});
vis[j][k] = true;
}
}
}
}
return -1;
}
}
|
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
| class Solution {
public:
int minimumJumps(vector<int>& forbidden, int a, int b, int x) {
unordered_set<int> s(forbidden.begin(), forbidden.end());
queue<pair<int, int>> q;
q.emplace(0, 1);
const int n = 6000;
bool vis[n][2];
memset(vis, false, sizeof(vis));
vis[0][1] = true;
for (int ans = 0; q.size(); ++ans) {
for (int t = q.size(); t; --t) {
auto [i, k] = q.front();
q.pop();
if (i == x) {
return ans;
}
vector<pair<int, int>> nxts = {{i + a, 1}};
if (k & 1) {
nxts.emplace_back(i - b, 0);
}
for (auto [j, l] : nxts) {
if (j >= 0 && j < n && !s.count(j) && !vis[j][l]) {
vis[j][l] = true;
q.emplace(j, l);
}
}
}
}
return -1;
}
};
|
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
| func minimumJumps(forbidden []int, a int, b int, x int) (ans int) {
s := map[int]bool{}
for _, v := range forbidden {
s[v] = true
}
q := [][2]int{[2]int{0, 1}}
const n = 6000
vis := make([][2]bool, n)
vis[0][1] = true
for ; len(q) > 0; ans++ {
for t := len(q); t > 0; t-- {
p := q[0]
q = q[1:]
i, k := p[0], p[1]
if i == x {
return
}
nxt := [][2]int{[2]int{i + a, 1}}
if k&1 == 1 {
nxt = append(nxt, [2]int{i - b, 0})
}
for _, e := range nxt {
j, l := e[0], e[1]
if j >= 0 && j < n && !s[j] && !vis[j][l] {
q = append(q, [2]int{j, l})
vis[j][l] = true
}
}
}
}
return -1
}
|
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
| function minimumJumps(forbidden: number[], a: number, b: number, x: number): number {
const s: Set<number> = new Set(forbidden);
const q: [number, number][] = [[0, 1]];
const n = 6000;
const vis: boolean[][] = Array.from({ length: n }, () => [false, false]);
vis[0][1] = true;
for (let ans = 0; q.length; ++ans) {
for (let t = q.length; t; --t) {
const [i, k] = q.shift()!;
if (i === x) {
return ans;
}
const nxt: [number, number][] = [[i + a, 1]];
if (k & 1) {
nxt.push([i - b, 0]);
}
for (const [j, k] of nxt) {
if (j >= 0 && j < n && !s.has(j) && !vis[j][k]) {
vis[j][k] = true;
q.push([j, k]);
}
}
}
}
return -1;
}
|