某个 bug 的家位于 x 轴上的位置x。帮助他们从位置到达那里0。
bug按照以下规则跳转:
它可以向前(向右)精确跳跃a位置。
它可以精确地向后(向左)跳跃b位置。
它不能连续向后跳两次。
它不能跳转到任何forbidden位置。
该错误可能会向前跳转到其所在位置之外,但它无法跳转到以负整数编号的位置。
给定一个整数数组forbidden,其中forbidden[i]表示 bug 无法跳转到该位置forbidden[i],而整数a、b和 则x返回bug 到达其起始位置所需的最小跳转次数。如果没有可能的跳跃序列使 bug 到达位置x,则返回-1.
示例1:
输入: forbidden = [14,4,18,1,15], a = 3, b = 15, x = 9
输出: 3
解释:向前跳转 3 (0 -> 3 -> 6 -> 9) 将得到虫子回家。
示例2:
输入:禁止 = [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) 将把 bug 带回家。
1 <= forbidden.length <= 1000
1 <= a, b, forbidden[i] <= 2000
0 <= x <= 2000
中的所有元素forbidden都是不同的。
位置x不被禁止。
此题感觉最大的难点在对于最大值的判断和选择的问题上,确定了最大值的问题,用广搜就能解决。
最大值问题标准答案:
思路
看题目解答。
这题对于思路的判断是要精准的确定是广搜的解决思路,因为要确定最优解,而且如果不加限制的进行递归操作,堆栈很大而且不好限制路数。
最大值判断,个人感觉难度过大。
可以用2000+a+b(因为超出的部分肯定需要返回才能到达,而且返回只能单次进行,所以)代替,就是速度慢一点。
class Solution {
public int minimumJumps(int[] forbidden, int a, int b, int x) {
Queue<int[]> queue = new ArrayDeque<int[]>();
Set<Integer> visited = new HashSet<Integer>();
Set<Integer> forbiddenset = new HashSet<Integer>();
visited.add(0);
int now_sit,dirction,step;
int max = 2000+a+b;
for(int i : forbidden)
forbiddenset.add(i);
int[] q = new int[]{0,1,0};
queue.add(q);
while(!queue.isEmpty()){
q = queue.poll();
if (q[0]==x)
return q[2];
dirction = q[1];
step=q[2];
now_sit=q[0]+a;
if (now_sit>=0&&now_sit<=max&&!visited.contains(now_sit)&&!forbiddenset.contains(now_sit)){
queue.offer(new int[]{now_sit,1,step+1});
visited.add(now_sit);
}
now_sit=q[0]-b;
if (now_sit>=0&&now_sit<=max&&dirction==1&&!visited.contains(-now_sit)&&!forbiddenset.contains(now_sit)) {
queue.offer(new int[]{now_sit, 0, step + 1});
visited.add(-now_sit);
}
}
return -1;
}
}
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/squares-of-a-sorted-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。