刷刷刷 Day 32 | 55. 跳跃游戏

55. 跳跃游戏

LeetCode题目要求

给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。

数组中的每个元素代表你在该位置可以跳跃的最大长度。

判断你是否能够到达最后一个下标。

示例

输入:nums = [2,3,1,1,4]
输出:true
解释:可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。
解题思路

经过跳跃分析,如下图都可以到达尾部:

图

而实际上要到达数组的终点,我们每次都以最大值来跳跃,且要把这个覆盖的范围不断的累加,直到覆盖数组长度,那么就满足条件

上代码

class Solution {
    public boolean canJump(int[] nums) {

        // 本题的跳跃从下标 0 开始跳跃,最大步骤就是 下标对应的值
        // 当跳跃到的下标值为 0 且不是最后一个元素,那就失败了。
        // 要想达到尾部,且保证最优,那么优先跳最大步骤,如果最大步无法到达,那么就会无法达到尾部

        // 2 0 0 3 1

        // 跳跃范围
        int range = 0;
        
        int len = nums.length;

        for (int i = 0; i <= range; i++) {
            // 动态变更可覆盖的范围,在已覆盖的范围内与新的覆盖值对比,取大的
            range = Math.max(range, i + nums[i]);
            if (range >= len - 1) {
                return true;
            }
        }

        return false;
        
    }
}
重难点

循环范围是动态变化的

附:学习资料链接

posted @ 2023-02-14 23:03  blacksonny  阅读(35)  评论(0编辑  收藏  举报