给定一个非负整数数组,你最初位于数组的首位。

数组中的每个元素表示你在该位置的最大跳跃长度。

你的目标是用最小跳跃次数到达最后一个索引。

例如:

给定一个数组 A = [2,3,1,1,4]

跳到最后一个索引的最小跳跃数是 2。(从索引 0 跳到 1 跳1步,然后跳3步到最后一个索引。)

注意:

假设你总是可以到达最后一个索引位置。

详见:https://leetcode.com/problems/jump-game-ii/description/

Java实现:

curReach是维护的当前能跳到的最大位置,maxReach是指从之前的点能到达到得最远位置。

当i 大于之前点能跳到的最大位置时,就需要跳一步,并把curReach更新为maxReach。

最后返回若是curReach能到最后一个元素,就返回step, 若是到不了,就说明根本走不到最后一步,返回0。



class Solution {
public int jump(int[] nums) {
int n=nums.length;
int step=0;
int curReach=0;
int maxReach=0;
for(int i=0;i<n;++i){
if(curReach<i){
++step;
curReach=maxReach;
}
maxReach=maxReach>(nums[i]+i)?maxReach:(nums[i]+i);
}
return maxReach<n-1?0:step;
}
}


 C++实现:



class Solution {
public:
int jump(vector<int>& nums) {
int n=nums.size();
int res=0;
int curRch=0;
int maxRch=0;
for(int i=0;i<n;++i)
{
if(curRch<i)
{
++res;
curRch=maxRch;
}
maxRch=max(maxRch,nums[i]+i);
}
return res;
}
};