leetcode45. 跳跃游戏 II

本文探讨了一种解决跳跃游戏问题的贪心算法,旨在找到从数组首位置到末位置所需的最少跳跃次数。通过动态计算每次跳跃的最大覆盖范围并更新步长,重点在于求解最优路径而非具体步骤。两种实现方式对比,提供了简洁高效的解决方案。
摘要由CSDN通过智能技术生成

1.题目描述:

给你一个非负整数数组nums,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。你的目标是使用最少的跳跃次数到达数组的最后一个位置。假设你总是可以到达数组的最后一个位置。

2.贪心算法:

leetcode55. 跳跃游戏不同在于默认能到达最末,但是需要求出最小的次数。实际上就是求每一次跳跃动态覆盖最大范围直至能到最末位置的最大范围数目,其中也是不关注每次怎么跳,跳多远,只关注最少的次数。需要注意的是下一次length的最大范围更新,与i循环遍历到当前curLength的最末是同步的,至少不会迟于。

class Solution {
    public int jump(int[] nums) {
        int length = 0;
        int count = 0;
        int curLength = 0;
        for (int i = 0; i < nums.length - 1; i++) {//停在倒数第二个位置,简化最后一次跳跃
            length = Math.max(length, i + nums[i]);
            if (i == curLength) {
                count++;
                curLength = length;
            }    
        }
        return count;
    }
}

或:(推荐)

class Solution {
    public int jump(int[] nums) {
        if (nums == null || nums.length == 0 || nums.length == 1) return 0;
        int maxLength = 0;//下一步覆盖最大区域
        int count = 0;
        int curLength = 0;//当前覆盖最大区域
        for (int i = 0; i < nums.length; i++) {
            maxLength = Math.max(maxLength, i + nums[i]);//更新覆盖最大区域
            if (length >= nums.length - 1) {//当前再跳一步即可
                count++;
                break;
            }
            if (i == curLength) {//走到当前覆盖最大区域,并更新下一步覆盖最大区域
                count++;
                curLength = maxLength;
            }    
        }
        return count;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值