题目描述
给你一个非负整数数组 nums
,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个下标,如果可以,返回 true
;否则,返回 false
。
示例 1:
输入: nums = [2,3,1,1,4]
输出: true
解释: 可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。
示例 2:
输入: nums = [3,2,1,0,4]
输出: false
解释: 无论怎样,总会到达下标为 3 的位置。但该下标的最大跳跃长度是 0 , 所以永远不可能到达最后一个下标。
提示:
- 1 <= nums.length <= 104
- 0 <= nums[i] <= 105
代码及注释
func canJump(nums []int) bool {// 初始化覆盖范围为0cover := 0// 获取数组的长度length := len(nums) - 1// 遍历数组for i := 0; i <= cover; i++ {// 更新覆盖范围cover = max(i + nums[i], cover)// 检查是否可以到达最后一个位置if cover >= length {return true}}// 如果遍历完整个数组都没有找到一个位置可以达到最后一个位置,则返回falsereturn false
}// 辅助函数,返回两个数中的最大值
func max(x, y int) int {if x > y {return x}return y
}
代码解释
-
初始化覆盖范围为0
cover := 0
我们使用
cover
变量来表示当前位置可以到达的最远距离。初始时,从第一个位置出发,我们可以覆盖的范围是0。 -
获取数组的长度
length := len(nums) - 1
获取数组的长度,这样我们可以检查是否可以覆盖到数组的最后一个位置。
-
遍历数组
for i := 0; i <= cover; i++ {
我们从第一个位置开始遍历,直到
cover
位置,这是因为在当前位置之前的每个位置都可以从前面的位置跳到。 -
更新覆盖范围
cover = max(i + nums[i], cover)
对于每一个位置
i
,我们计算从当前位置可以跳跃的最远距离,然后与当前的cover
比较,取其中更大的值。这确保我们选择了最远的距离作为下一步可以达到的最远距离。 -
检查是否可以到达最后一个位置
if cover >= length {return true }
在每次更新
cover
后,我们检查是否可以覆盖到数组的最后一个位置,如果可以,则返回true
。 -
返回结果
return false
如果遍历完整个数组都没有找到一个位置可以达到最后一个位置,则返回
false
。
这道题使用了贪心算法的思想。我们从第一个位置开始,持续更新能够跳跃到的最远位置,并检查这个最远位置是否能达到数组的最后一个位置。如果可以跳跃到最后一个位置,那么整个数组就可以被跳跃到。