leetcode 55. 跳跃游戏

Question5

You are given an integer array nums. You are initially positioned at the array’s first index, and each element in the array represents your maximum jump length at that position. Return “yes“ if you can reach the last index, or “no“ otherwise.
Input: nums = [2,3,1,1,4]
Output: “yes”

2、解题思路

如果某一个作为 起跳点 的格子可以跳跃的距离是 3,那么表示后面 3 个格子都可以作为 起跳点
可以对每一个能作为 起跳点 的格子都尝试跳一次,把能跳到最远的距离 不断更新如果可以一直跳到最后,就成功了

3、代码实现

class Solution {
    public boolean canJump(int[] nums) {
        /*
        定义一个cover,表示当前元素能跳的最大覆盖范围,每次我都只往右跳一格
        然后更新cover范围,将当前索引的覆盖范围和上一次的覆盖范围cover相比,
        两者中的最大值就是更新后的cover。当最大范围>=数组最后一个索引时,返回true
         */
         int cover = 0;
         for(int i = 0; i <= cover; i++){
//nums[i]+i 是因为当前的最大覆盖范围等于从当前元素的位置加上当前元素可以跳跃的最大长度,是从i这个位置开始起跳的。可以画个图更容易理解 
             cover = Math.max(i + nums[i] , cover);
             if(cover >= nums.length-1){
                 return true;
             }
         }
         return false;
    }
}

4、复杂度分析

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

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

你可能感兴趣的:(贪心,leetcode,游戏,算法)