题目:
给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。
每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。
返回到达 nums[n - 1] 的最小跳跃次数。
思路:
-
如果某一个作为 起跳点 的格子可以跳跃的距离是 3,那么表示后面 3 个格子都可以作为 起跳点。
1.1. 可以对每一个能作为 起跳点 的格子都尝试跳一次,把 能跳到最远的距离 不断更新。 -
如果从这个 起跳点 起跳叫做第 1 次 跳跃,那么从后面 3 个格子起跳 都 可以叫做第 2 次 跳跃。
-
所以,当一次 跳跃 结束时,从下一个格子开始,到现在 能跳到最远的距离,都 是下一次 跳跃 的 起跳点。
3.1. 对每一次 跳跃 用 for 循环来模拟。3.1.1跳完一次之后,更新下一次 起跳点 的范围。
3.1.2在新的范围内跳,更新 能跳到最远的距离。 -
记录 跳跃 次数,如果跳到了终点,就得到了结果。
C++:
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
class Solution
{
public:
int jump(vector<int>& nums)
{
int times = 0;
int start = 0;
int end = 1;
int n =nums.size();
while(end < n)
{
int maxPose = 0;
for(int i = start; i<end; i++)
{
// 能跳到的最远距离
maxPose = max(maxPose,i+nums[i]);
}
start = end; // 下一次起跳范围开始的格子
end = maxPose + 1; // 下一次起跳范围结束的格子
times++;
}
return times;
}
};