题目描述:
给定一个长度为
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:
输入: nums = [2,3,1,1,4]
输出: 2
解释: 跳到最后一个位置的最小跳跃数是 2。
从下标为 0 跳到下标为 1 的位置,跳 1步,然后跳 3
步到达数组的最后一个位置。
示例 2:
输入: nums = [2,3,0,1,4]
输出: 2
题解思想:
算法的核心思想是在遍历数组的过程中,不断更新当前能够到达的最远索引位置 max_far
,同时判断是否需要进行跳跃。当当前索引 i
达到上一步所能够到达的最远位置 end
时,说明需要进行下一次跳跃,此时更新 end
为当前能够到达的最远索引位置 max_far
,并将步数 step
加一。
1.变量说明:
max_far
: 表示当前能够到达的最远索引位置。step
: 表示跳跃的步数,即从数组的第一个元素跳到最后一个元素所需的最小步数。end
: 表示当前步数内能够到达的最远索引位置。2.核心思想:
- 在遍历数组的过程中,不断更新
max_far
,表示当前能够到达的最远索引位置。- 判断是否需要进行跳跃:当当前索引
i
达到上一步所能够到达的最远位置end
时,说明需要进行下一次跳跃。- 在每次跳跃时,更新
end
为当前能够到达的最远索引位置max_far
,并将步数step
加一。3.时间复杂度:
- 由于只需要遍历数组一次,时间复杂度为 O(n),其中 n 是数组的长度。
4.返回值:
- 函数返回的
step
表示从数组的第一个元素跳到最后一个元素所需的最小步数。
代码:
class Solution { public: int jump(vector<int>& nums) { int max_far = 0; // 当前能够到达的最远索引位置 int step = 0; // 跳跃的步数 int end = 0; // 当前步数内能够到达的最远索引位置 for(int i = 0; i < nums.size() - 1; i++) { max_far = std::max(max_far, i + nums[i]); // 更新当前能够到达的最远索引位置 if(i == end) { end = max_far; // 更新当前步数内能够到达的最远索引位置 step++; // 步数加一,因为需要进行一次跳跃 } } return step; // 返回跳跃的总步数 } };
总结:
这个算法通过贪心策略选择每次跳跃时能够到达的最远位置,从而在遍历数组的过程中不断更新步数,最终得到跳到最后一个元素所需的最小步数。