Day81 代码随想录打卡|贪心算法篇---跳跃游戏 II

题目(leecode T45):给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]

每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说,如果你在 nums[i] 处,你可以跳转到任意 nums[i + j] 处:

  • 0 <= j <= nums[i] 
  • i + j < n

返回到达 nums[n - 1] 的最小跳跃次数。生成的测试用例可以到达 nums[n - 1]

方法:本题和昨天的有相似之处但不完全一样,昨天的题目只要判断能否到达最后即可,而本题需要的是以最小的次数跳到最后位置,因此相比昨天的题目难度更大。但思路仍然是以最大覆盖范围做文章,我们遍历每个元素都能得到当前的最大覆盖范围,而当当前元素的最大覆盖范围到达不了最后位置时,我们就需要往下再走一步了,并再次计算下一步的最大覆盖范围,同时步数加1.一直重复这样的步骤,直到我们的步数可以到达最后位置就立即停止,当前的计数就是最小跳到最后位置的次数。

题解:

class Solution {
public:
    int jump(vector<int>& nums) {
        if (nums.size() == 1) return 0;
        int curDistance = 0;   
        int ans = 0;            // 记录走的最小次数
        int nextDistance = 0;   
        for (int i = 0; i < nums.size(); i++) {
            nextDistance = max(nums[i] + i, nextDistance);  // 更新下一步覆盖最远距离下标
            if (i == curDistance) {                         // 遇到当前覆盖最远距离下标
                ans++;                                  // 需要走下一步
                curDistance = nextDistance;             // 更新当前覆盖最远距离下标(相当于加油了)
                if (nextDistance >= nums.size() - 1) break;  // 到达最后位置
            }
        }
        return ans;
    }
};
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值