Leetcode 45. Jump Game II

0.问题分析

  1. 题目说明:假设你总是可以到达数组的最后一个位置。即一定存在一条路线能够到达最后一个位置,而不是说中间没有 0 ,只是存在可以越过 0 的路线。
  2. 贪心算法:找能跳的最远的,使用 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;
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值