LeetCode-笔记-45.跳跃游戏II-贪心算法
给定一个非负整数数组,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
你的目标是使用最少的跳跃次数到达数组的最后一个位置。
示例:
输入: [2,3,1,1,4]
输出: 2
解释: 跳到最后一个位置的最小跳跃数是 2。
从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。
说明: 假设你总是可以到达数组的最后一个位置。
本题整体思路,贪心算法;
本题跳跃思路如下图所示,找出跳的最远的路线。
查看上图,寻找最远的跳跃路线,就这一步走完与下一步最远的路线之和的最大值,浅蓝色①与深蓝色②是最开始跳跃的路线,可得②比①远。顾第一次跳到数组下标2处。同理第二次跳跃到下标6处,第三次跳跃到下标12处。
注意:重点来了
在不能一步跳跃到尾部之前上述思路是完全正确,但可以一次跳跃到尾部之后,就会多出不必要的跳跃,观察上图,下标6处应当跳到下标7值为10处预计路线最远,按理说应当跳到下标7,但下标6可以直接跳到最后,因此跳跃到下标7是不必要的跳跃。如果可以直接跳到尾部,此时应当直接跳跃值加一,返回值。
附上代码:
class Solution {
public:
int jump(vector<int>& nums) {
int length=nums.size();//求数组长度
int sum=0;
for(int i=0;i<length-1;){//循环
int max_jump=0;
int addr=0;
for(int j=1;j<=nums[i]&&(i+j)<length;++j){//跳跃,防止数组越界
if((i+j)>=length-1) return ++sum;//可以直接尾部,直接返回
if(max_jump<(nums[i+j]+j)){
addr=j;
max_jump=nums[i+j]+j;
}
}
sum++;
i=i+addr;
}
return sum;
}
};