本题与55. 跳跃游戏十分类似,区别在于本题是要求出最小的跳跃次数。
在55. 跳跃游戏的框架上,我们需要增加一些东西:
- 既然要计算最小跳跃次数,就需要用一个变量计数跳跃的次数;
- 需要一次前瞻,来计算之后那次跳跃可能的覆盖范围,即需要两个变量curDistance和nextDistance,分别记录当前覆盖距离的最远下标和下一步跳跃覆盖的最远距离下标;
- 在当前覆盖距离范围内的时候,不断更新nextDistance,直到到达最远的curDistance,此时需要步数+1,把curDistanced的值更新为nextDistance,并判断是否到达最后一个下标,如果到达则break。
实现代码如下:
class Solution {public int jump(int[] nums) {if(nums.length==1) return 0;int curDistance=0; //记录当前覆盖最远距离的下标int ans=0;//记录步数int nextDistance=0; //记录下一步覆盖最远距离的下标for(int i=0;i<nums.length;i++) {//更新下一步覆盖最远距离的下标nextDistance=Math.max(nextDistance, i+nums[i]);//若达到了当前覆盖最远距离的下标if(i==curDistance) {ans++;curDistance=nextDistance;if(nextDistance>=nums.length-1) break;}}return ans;}
}