主要是判断好上界,这里我直接取了6000作为上界,然后进行广度优先遍历:
维护一个数组作为被访问点
广度遍历时需要记录前一次是向前跳还是向后跳
代码如下:
class Solution {
public int minimumJumps(int[] forbidden, int a, int b, int x) {
Set<Integer> set = new HashSet<>();
for(int i:forbidden){
set.add(i);
}
Queue<int[]> queue = new LinkedList<>();
queue.add(new int[]{0,0});
set.add(0);
int res = -1;
while (!queue.isEmpty()){
int num = queue.size();
res++;
while (num-->0){
int[] temp = queue.poll();
if(temp[0]==x){
return res;
}
if(temp[0]-b>=0 && temp[1]!=1 && !set.contains(temp[0]-b)){
queue.add(new int[]{temp[0]-b,1});
set.add(temp[0]-b);
}
if(temp[0]+a<6000 && !set.contains(temp[0]+a)){
queue.add(new int[]{temp[0]+a,0});
set.add(temp[0]+a);
}
}
}
return -1;
}
}