刷刷刷 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;
}
}
重难点
循环范围是动态变化的
附:学习资料链接