
解法
题解中的贪心算法
每次都更新可以到达终点的点。更新一次,次数加一
题目中保证了可以到n-1,所以我们每次只需要找到离终点最远的点,也就是索引最小的点。
直到索引为0的点,也可以到达最后的点。返回次数。

class Solution {
public int jump(int[] nums) {
int n=nums.length;
int count=0;
int poi=n-1;
while(poi>0){
for(int i=0;i<n;i++){
if(i+nums[i]>=poi){
poi=i;
break;
}
}
count++;
}
return count;
}
}
自己写的使用队列的解法
倒着找。每次都将可以到达n-1位置的点加入到队列中去。第一次直接将n-1加入到队列中,后面当i+nums[i]>=队列的头的时候,将i加入到辅助队列(因为边加边取,就会无法区分是上一次的还是这一次的)中,当i打大于队列的头的时候,将队列的头出队。这样就可以精确地找到次数了。

class Solution {
public int jump(int[] nums) {
int n=nums.length;
if(n==1)return 0;
boolean []list=new boolean[n];
int count=0;
Queue<Integer>queue=new LinkedList();
Queue<Integer>q=new LinkedList();
queue.offer(n-1);
for(int j=0;j<n;j++){
if(j!=0){
queue=q;
q=new LinkedList();
}
for(int i=0;i<n;i++){
int poi=-1;
if(!queue.isEmpty()){
poi=queue.peek();
}else{
break;
}
if(i+nums[i]>=poi){
list[i]=true;
q.offer(i);
}
if(i==poi)queue.poll();
}
count++;
if(list[0])return count;
}
return count;
}
}