题目描述:
解题:
法一:超越时间限制
bool canJump(int nums, int numsSize) {
/

题目理解:
目的:从nums[0]跳到nums[numsSize - 1] 约束:跳跃长度jumplength <= nums[pos] pos:当前数组元素下标
目标:如果可以达到目的 跳跃次数 越少越好 否则输出false
特殊点:
1.nums[pos] = 0 && pos < numsSize - 1
2.不满足跳到最后的条件:
1> 总会到达跳跃长度为0的下标
思路:
1.跳过nums[pos] = 0 && pos < numsSize - 1的数组元素
2.减少跳跃次数

思路2:判断如何从nums[0]跳到跳跃长度为0的下标,能找到输出false,否则输出true
1.遍历数组,找到nums[pos] = 0的pos

思路3:只要能找到一条跳到nums[numsSize - 1]的路,能找到输出true,否则输出false
1.pos = 0 从nums[pos]开始,每次跳跃nums[pos],
2.如果nums[pos] = 0 回到上一个位置space
    if nums[space] >= 2 则 pos = pos + nums[pos] - 1,否则继续退到上一个位置
3.如果pos + nums[pos] >= numsSize - 1 返回true
*/
if(nums[0] == 0 && numsSize != 1){
    return false;
}
else if(nums[0] == 0 && numsSize == 1){
    return true;
}

int pos = 0;
int amount = 0;
while(pos <= numsSize - 1 && pos >= 0){
    int space = nums[pos];  //  记录上一次走的步长
    pos = pos + nums[pos];
    amount++;
    if(pos < numsSize - 1 && nums[pos] == 0 ){
        if(space > 1 && amount > 0){
            pos = pos - space - 1;
        }
        else{
            if(amount > 0){
                pos = pos - 1;
                amount--;
            }
            for(int i = amount; i > 0; i--){
                pos = pos - nums[i];
                if(pos >= 0 && nums[pos] > 1){
                    pos = pos + nums[pos] - 1;
                }
                else if (pos = 0){
                    return false;
                }
            }

        }
    }
}
if(pos >= numsSize - 1){
    return true;
}
else{
    return false;
}

}
法二:
bool canJump(int nums, int numsSize) {
/
思路:
目的:跳到最后一个元素numsSize - 1,只要能跳跃的最大长度大于等于numsSize - 1就能到达
*/
if(numsSize == 1){
return true;
}
int reachmax = 0;
for(int i = 0; i < numsSize - 1; i++){
if(nums[i] == 0 && reachmax <= i){
return false;
}
reachmax = reachmax > i + nums[i] ? reachmax : i + nums[i];
if(reachmax >= numsSize - 1){
return true;
}
}
return false;
}
体会:
利用贪心算法寻找局部最优解
具体做法:每走一步就找寻一次最优解,直至找到最后
例如,在该问题中,走到index 0,更新一次能够走的最大距离,继续顺序走index 2,判断在index 2能走的最大距离,以此类推