8.5跳跃游戏(LC55-M)

8.5跳跃游戏(LC55-M)_第1张图片

算法:

其实跳几步无所谓,关键在于可跳的覆盖范围!

不一定非要明确一次究竟跳几步,每次取最大的跳跃步数,这个就是可以跳跃的覆盖范围。

这个范围内,别管是怎么跳的,反正一定可以跳过来。

那么这个问题就转化为跳跃覆盖范围究竟可不可以覆盖到终点!

每次移动取最大跳跃步数(得到最大的覆盖范围),每移动一个单位,就更新最大覆盖范围。

局部最优:每次取最大跳跃步数(取最大覆盖范围)

整体最优解:最后得到整体最大覆盖范围,看是否能到终点

正确代码:

class Solution {
    public boolean canJump(int[] nums) {
       int coverrange = 0;
       if(nums.length==1){
           return true;
       }
       //i表示覆盖范围内可以跳跃的索引下标
       for(int i=0;i<=coverrange;i++){
           coverrange = Math.max(coverrange, i+nums[i]);
           if (coverrange>=nums.length-1){
               return true;
           }

       }
       return false;

    }
}

时间空间复杂度:

时间复杂度:O(n),其中 n为数组的大小。只需要访问 nums 数组一遍,共 n个位置。

空间复杂度:O(1),不需要额外的空间开销。

你可能感兴趣的:(#,8.贪心算法,算法,数据结构,leetcode)