这道题目要求判断是否能够从数组的起始位置跳跃到最后一个位置。给定一个非负整数数组 nums
,数组中的每个元素表示在当前位置最多可以跳跃的步数。我们需要确定是否存在一种跳跃方式,能够到达数组的最后一个位置。
解决这个问题的一种常用方法是使用贪心算法。我们可以遍历数组 nums
,维护一个变量 far
,表示当前能够到达的最远位置。在遍历的过程中,我们更新 far
的值为当前位置加上能够跳跃的最大步数(nums[i]
)。如果在遍历过程中,发现 far
小于当前的索引 i
,则意味着无法到达当前位置,我们返回 false
。最后,如果能够遍历完整个数组,说明可以成功到达最后一个位置,我们返回 true
。
下面是对给定代码的详细解释:
class Solution {
public boolean canJump(int[] nums) {
int far = 0; // 当前能够到达的最远位置
// 遍历数组 nums
for (int i = 0; i < nums.length; i++) {
// 如果 far 小于当前的索引 i,说明无法到达当前位置,返回 false
if (far < i) {
return false;
}
// 更新 far 的值为当前位置加上能够跳跃的最大步数
far = Math.max(far, i + nums[i]);
}
return true; // 能够遍历完整个数组,返回 true
}
}
这个解法的时间复杂度为 O(n),其中 n 是数组 nums
的长度。我们只需要遍历一次数组来判断是否能够到达最后一个位置。
这个题解基于贪心算法的思想,通过维护一个变量 far
来记录当前能够到达的最远位置。我们每次更新 far
的值为当前位置加上能够跳跃的最大步数,确保能够跳到更远的位置。如果在遍历过程中,发现 far
小于当前的索引 i
,意味着无法到达当前位置,返回 false
。最后,如果能够遍历完整个数组,说明可以成功到达最后一个位置,返回 true
。