1654. 到家的最少跳跃次数Java
文章发布较早,内容可能过时,阅读注意甄别。
# 题目
有一只跳蚤的家在数轴上的位置 x 处。请你帮助它从位置 0 出发,到达它的家。
跳蚤跳跃的规则如下:
- 它可以 往前 跳恰好 a 个位置(即往右跳)。
- 它可以 往后 跳恰好 b 个位置(即往左跳)。
- 它不能 连续 往后跳 2 次。
- 它不能跳到任何 forbidden 数组中的位置。 跳蚤可以往前跳 超过 它的家的位置,但是它 不能跳到负整数 的位置。
给你一个整数数组 forbidden ,其中 forbidden[i] 是跳蚤不能跳到的位置,同时给你整数 a, b 和 x ,请你返回跳蚤到家的最少跳跃次数。如果没有恰好到达 x 的可行方案,请你返回 -1 。
示例 1:
输入:forbidden = [14,4,18,1,15], a = 3, b = 15, x = 9
输出:3
解释:往前跳 3 次(0 -> 3 -> 6 -> 9),跳蚤就到家了。
示例 2:
输入:forbidden = [8,3,16,6,12,20], a = 15, b = 13, x = 11
输出:-1
示例 3:
输入:forbidden = [1,6,2,14,5,17,4], a = 16, b = 9, x = 7
输出:2
解释:往前跳一次(0 -> 16),然后往回跳一次(16 -> 7),跳蚤就到家了。
提示:
- 1 <= forbidden.length <= 1000
- 1 <= a, b, forbidden[i] <= 2000
- 0 <= x <= 2000
- forbidden 中所有位置互不相同。
- 位置 x 不在 forbidden 中。
# 思路
dfs
# 解法
class Solution {
public int minimumJumps(int[] forbidden, int a, int b, int x) {
int max=Math.max(Arrays.stream(forbidden).max().getAsInt()+a,x)+b;
boolean[] visited=new boolean[max+1];
int[] dp=new int[max+1];
Arrays.fill(dp,Integer.MAX_VALUE);
for (int i : forbidden) {
dp[i]=-1;
}
dfs(0,a,b,0,x,max,dp,false);
return dp[x]==Integer.MAX_VALUE?-1:dp[x];
}
private void dfs(int now, int right, int left, int step, int end, int max, int[] dp, boolean jump) {
if (dp[now]==-1||dp[now]<=step)
return;
dp[now]=step;
if (jump&&now-left>=0){
dfs(now-left,right,left,step+1,end,max,dp,false);
}
if (now+right<=max){
dfs(now+right,right,left,step+1,end,max,dp,true);
}
}
}
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
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
# 总结
- 分析出几种情况,然后分别对各个情况实现


