在本题中,我们要模仿整个跳跃过程,当前位置数组元素为nums[i],那我们就最大能往后跳nums[i]步,可以小于等于这个数。如果我们直接遍历数组,那么我们需要每一步都控制跳跃0——nums[i]步,这样不可能实现。
所以我们引入coverRange这个变量,作为我们当前位置能覆盖到的最大范围,如果coverRange>=nums.length-1,说明我们从0开始,能够覆盖整个数组,所以我们在循环遍历数组时,只需要一直更新coverRange即可!
但是我们要注意,并不是当前位置不能覆盖到最后就表示此前所有的元素都不可以覆盖到最后,比如[2,3,1,1,4]。在第一个1的位置,我们最多只能往后跳1步,覆盖不到最后,但1前面的3,我们可以往后跳3步,可以覆盖到最后,所以,我们在更新coverRange的时候,需要求一下当前可跳跃范围nums[i]+i和coverRange的最大值。
class Solution {
public boolean canJump(int[] nums) {
if (nums.length == 1) {
return true;
}
//覆盖范围, 初始覆盖范围应该是0,因为下面的迭代是从下标0开始的
int coverRange = 0;
//在覆盖范围内更新最大的覆盖范围
for (int i = 0; i <= coverRange; i++) {
coverRange = Math.max(coverRange, i + nums[i]);
if (coverRange >= nums.length - 1) {
return true;
}
}
return false;
}
}