题目

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

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

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

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

示例 1:

  1. 输入: nums = [2,3,1,1,4]
  2. 输出: 2
  3. 解释: 跳到最后一个位置的最小跳跃数是 2
  4. 从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。

示例 2:

输入: nums = [2,3,0,1,4]
输出: 2

提示:

  • 1 <= nums.length <= 10^4
  • 0 <= nums[i] <= 1000

    解题方法

    贪心

    局部最优:每一步走到最远距离
    全局最优:最远距离的组合
    不用考虑下一个跳跃点具体在哪里,只需要考虑每次跳跃所能达到的最远覆盖距离即可。

    • 使用mostright表示当前跳跃能达到的最远距离,初始值为0
    • 使用next表示下次跳跃能达到的最远距离,初始值为0
    • 使用idx遍历数组,当idx = mostright时,使用next更新mostright,并对步数加1
    • 使用num表示跳跃步数,初始值为0

时间复杂度O(n),空间复杂度O(1)
C++代码:

class Solution {
public:
    int jump(vector<int>& nums) {
        int num = 0;
        int mostright = 0;
        int next = 0;
        int idx = -1;
        while(mostright<nums.size()-1) {
            idx++;
            next = max(next, nums[idx]+idx);
            if(idx==mostright) {
                mostright = next;
                num++;
            }
        }

        return num;
    }
};