原题链接
- 与普通跳跃游戏不同,此题限制了最小的跳跃步数
- 定义了本次跳跃的end位置,也是下次起跳的位置
- 在for循环里,i 要满足 i < length - 1而不是 i < length;因为若i < length 则有可能i为数组的最后一个位置,这时统计的是数组的最后一个位置,这样函数就会越界。
- 在for循环内不断更新最大起跳位置,当i == end 的时候,将end 更新为当前能跳到的最远位置,然后steps++
- **二刷:**此题与上一题不同的是,上一题要求返回能否到达最后的位置,而此题要求返回到达最后的位置所需要几步?
- 关键位置是 在for循环的时候,要求 i < nums.length - 1 即 i 是不能达到倒数第二个位置的
- 当发现 i 与end 相等的时候, 则步数加一,同时给end 赋予新值
- 其中end的含义是:上次跳远能到达的最大位置,maxPosition的含义是,当前能跳到的最大位置。
- 设计的流程 for循环,当i 是不达到倒数第一个位置的时候,不断记录maxPosition,若当前的 i 覆盖了上一次的end 位置,则步数++,更新end
class Solution {
public int jump(int[] nums) {
int end = 0;
int maxPosition = 0;
int steps = 0;
for(int i = 0; i < nums.length - 1; i++){
maxPosition = Math.max(maxPosition, i + nums[i]);
if(i == end){
steps++;
end = maxPosition;
}
}
return steps;
}
}
class Solution {
public int jump(int[] nums) {
int length = nums.length;
int end = 0;
int maxPosition = 0;
int steps = 0;
for (int i = 0; i < length - 1; i++) {
maxPosition = Math.max(maxPosition, i + nums[i]);
if (i == end) {
end = maxPosition;
steps++;
}
}
return steps;
}
}