力扣45-跳跃游戏2——贪心算法&顺藤摸瓜&顺瓜摸藤

题目描述

给你一个非负整数数组 nums ,你最初位于数组的第一个位置。

数组中的每个元素代表你在该位置可以跳跃的最大长度。

你的目标是使用最少的跳跃次数到达数组的最后一个位置。

假设你总是可以到达数组的最后一个位置。

求解思路

顺瓜摸藤

  • 由于我们要找的找到最少的跳跃数,所以应该要求满足跳跃的距离最大;
  • 如果确定最后的一个数,在他的前面找索引最小的且能够跳到这个数的那个数
  • 比如这时候的target是数组最后的1,能满足跳到1的只有4和2,所以下一步就应该把4赋值给target;
  • 接着再找能跳到4的索引最小的数字;
  • 如何保证索引索引最小?将数组从左到右遍历就可以,第一个满足条件 i+nums[ i ] > target 的就是索引最小的数;
  • 每往前找到一个数时,证明跨了一步,变量res+1;
  • 最后返回res即可;

顺藤摸瓜

  • 就上面这个例子来讲,从2开始跳,能跳到的节点有 3 和 1;
  • 下面开始比较3 和 1 哪个能跳的更远,谁跳的远就选谁;
  • 不难发现3 能够跳到4,而1 只能跳到1 ;

  • 于是在3跳到4的过程中,还有1,1,4三个节点,就判断这三个节点哪个跳的更远,再就是哪个能跳到最后一个节点;
  • 在代码实现的过程中,需要创建两个变量maxPosition表示当前遍历的点能够跳到的最远的距离,end表示上次跳跃可达范围的边界,如果当前跳到end,则end需要更新为当前节点能够跳的最远的距离maxPosition,同时res更新+1。

输入输出示例end

代码

顺瓜摸藤

class Solution {
    public int jump(int[] nums) {
        int n = nums.length;
        int len = n - 1;
        int res = 0;
        while(len > 0){
            for(int i = 0; i < len; i++){
                if(i+ nums[i] >= len){
                    len = i;
                    res++;
                    break;
                }
            }
        }
        return res;
    }
}

顺藤摸瓜

class Solution {
    public int jump(int[] nums) {
        int position = nums.length;
        int maxPosition = 0;
        int end = 0;
        int res = 0;
        for(int i = 0; i < position - 1; i++){
            maxPosition = Math.max(maxPosition,i+nums[i]);
            if(i == end){
                end = maxPosition;
                res++;
            }
        }
        return res;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值