0.问题分析
- 题目说明:假设你总是可以到达数组的最后一个位置。即一定存在一条路线能够到达最后一个位置,而不是说中间没有 0 ,只是存在可以越过 0 的路线。
- 贪心算法:找能跳的最远的,使用 k 记录目前能够跳到的最高位置,使用 end 记录这次跳跃的边界,到达边界就跳跃次数 + 1。
1.过程解析(拌代码食用)
过程解析:
最开始遍历 i = 0, end = 0,因此 step 会进行 step ++,我们可以认为,这是开始起跳,因此跳跃次数 + 1。
而 nums[0] 这个数限制了你只能在落脚在某个范围内,假如 nums[0] = 8,那么你只能选择落脚在 [1, 8] 位置,而如果到了边界,那么肯定是一次新的起跳,因此次数需要再 + 1。
从 0 位置开始起跳,你落脚的必定是 [1, 8] 位置中能够跳得更远的(k = Math.max(k, i + nums[i]);),因为根据贪心思想,这样做能够尽可能的减少跳跃次数,因为更加接近最后一个位置。
因此当到达边界的时候,即将开始下一次跳跃,而下一次跳跃的最远落地点时刻用k记录着,所以将 end 更新为 k,并且step++。
2.代码实现
class Solution {
public int jump(int[] nums) {
int k = 0;
//记录跳跃的次数
int step = 0;
int end = 0;
for(int i = 0; i < nums.length - 1; i++){
k = Math.max(k, i + nums[i]);
//第一次起跳 或 到达跳跃的边界
if(i == end){ //再次起跳
step++;
end = k;
}
}
return step;
}
}