题目
给你一个非负整数数组 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
贪心算法: 利用可到达最远位置
分析
这个题目是判断我们是否可以跳跃到最后一个数组元素,数组上每个元素代表该位置可以跳跃的最大长度,那么我们可以利用贪心算法的思想,我们找到每一个位置能够到达的最远位置,如果能到达最后一个数组元素的位置那么就可以完成跳跃。
那么这个最远位置如何确定呢?我们可以通过遍历数组,此时下标为i,那么在下标i这个位置上我们最多能走的长度为nums[i],下标也就变成了i+nums[i]
代码
class Solution {
public boolean canJump(int[] nums) {
// 方法1可以到达最远位置
// 初始化最远位置reach
int reach = 0;
int n = nums.length;
// 遍历数组
for (int i = 0; i < n; i++) {
// 用i去和最远位置比较,如果i比最远位置大了,返回false
if (i > reach) {
return false;
}
// 如果当前i是小于最远位置reach的,那么更新reach
reach = Math.max(i + nums[i], reach);
}
//遍历完说明可以到达数组末
return true;
}
}