55 跳跃游戏
给定一个非负整数数组 nums
,你最初位于数组的 第一个下标 。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个下标。
- 不断更新当前能够到达的范围
maxReach
class Solution {
public boolean canJump(int[] nums) {
int maxReach = 0;
int i = 0;
while (i <= maxReach && maxReach < nums.length - 1) {
maxReach = Math.max(maxReach, i + nums[i]);
i++;
}
return maxReach >= nums.length - 1;
}
}
45 跳跃游戏Ⅱ
给定一个非负整数数组 nums
,你最初位于数组的 第一个下标 。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
求到达数组最后一个下标的最小跳跃次数。
按跳跃步数访问,当要跳第 i + 1 i+1 i+1步时,在第 i i i步可到达的范围里,记录第 i + 1 i+1 i+1步能跳跃的最远距离。当最远距离达到数组最后一个元素时,跳到了末尾,可结束循环。
class Solution {
public int jump(int[] nums) {
int count = 0;
// 当前最远可以跳到什么地方,下一步最远可以跳到什么地方
int maxReach = 0;
int nextReach = 0;
// 当前位置
int i = 0;
// 当跳跃count步,但未到达终点时,第count步的可达范围为[i, maxReach]
while (maxReach < nums.length - 1) {
// 看看跳count + 1步最远能够跳到哪里,更新nextReach
while (i <= maxReach) {
nextReach = Math.max(nextReach, i + nums[i]);
i++;
}
// 上面循环结束时,i = maxReach + 1
// 第count + 1步可达范围[i, nextReach]
maxReach = nextReach;
count++;
}
return count;
}
}