给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。你的目标是使用最少的跳跃次数到达数组的最后一个位置。
示例:
输入: [2,3,1,1,4]
输出: 2
解释: 跳到最后一个位置的最小跳跃数是 2。
从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。
说明:
假设你总是可以到达数组的最后一个位置。
基本思路:贪心算法,与 55. 跳跃游戏类似,主要的仍然不是跳的距离,而是覆盖范围。分为当前覆盖范围和下一步覆盖范围。在当前覆盖范围内,找到能跳到最远距离的局部最优解,依次迭代。
- 在当前覆盖范围内,寻找可以跳到最远距离的下一步的局部最优解,也就是下一步的覆盖范围
- 当前覆盖范围走到尽头后,更新为下一步的覆盖范围。
int jump(vector<int>& nums) {
if(nums.size()<2) //可省,不影响结果,但是在for循环中,必须要i<nums.size()-1;
return 0;
int cnt=0;
int r=0; //当前覆盖范围
int nextR=0; //下一步的覆盖范围
for(int i=0;i<nums.size()-1&&r>=nums.size()-1;i++){//如果i<nums.size()-1,即最后一步不用走
nextR=max(nextR,i+nums[i]);
if(i==r){ //走到当前覆盖范围尽头
r=nextR;
cnt++;
//cout<<i<<" "<<cnt<<" "<<r<<endl;
}
}
return cnt;
}
相关 55. 跳跃游戏