题目描述:

传送门-力扣

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

示例:

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

思路

从第一个位置开始,找出第一步能够到达的所有点,然后在能到达的所有点中选择最远的(贪心)作为第二次的起跳点,再从第二次起跳点能够到达的所有点选择多能到达最远的点作为第三次的起跳点……

  1. 首先选择位置0的点作为第一个起跳点,此时其可以到达位置1和位置2,因此可以用一个变量end来表示当前起跳点的跳远范围,即 end = i + num[i];
  2. 在该点的跳跃范围内寻找能够到达最远的点,并用一个变量maxPos保存,用来表示下一跳能够到达的最远的范围,并在本跳结束后,将其赋给end,即maxPos = max(maxPos, i + num[i]);
  3. 每次循环判断当前是否到达本跳的最远范围,如果到达最远范围,则将下一跳的最远范围maxPos赋给end,同时跳数+1表示在本跳的范围内已经跳了下一跳;

代码

class Solution {
public:
    int jump(vector<int>& nums) {
        int step = 0, maxPos = 0, end = 0;
        for(int i = 0; i < nums.size() - 1; i++)
        {
            maxPos = max(maxPos, i + nums[i]);  //从本跳范围内选择一点,作为下一跳的跳点,保存其到达的最远距离
            if(i == end)                        //当到达本跳的最远距离时,跳数加1,同时将maxPos赋给end,开始下一跳
            {
                step++;
                end = maxPos;
            }
        }
        return step;
    }
};