给定一个长度为 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
提示:
1 <= nums.length <= 104
0 <= nums[i] <= 1000
- 题目保证可以到达
nums[n-1]
思路:
- 如果某一个作为起跳点的格子可以跳跃的距离是 3,那么表示后面 3 个格子都可以作为起跳点。 可以对每一个能作为 起跳点 的格子都尝试跳一次,把能跳到最远的距离不断更新。
- 如果从这个起跳点起跳叫做第 1 次 跳跃,那么从后面 3 个格子起跳都可以叫做第 2 次 跳跃。
- 所以,当一次 跳跃 结束时,从下一个格子开始,到现在能跳到最远的距离,都是下一次 跳跃的起跳点。
- 对每一次 跳跃 用 for 循环来模拟:
- 跳完一次之后,更新下一次 起跳点 的范围。
- 在新的范围内跳,更新 能跳到最远的距离。
记录跳跃次数,如果跳到了终点,就得到了结果。
代码:
class Solution {
public:
int jump(vector<int>& nums) {
int start = 0;
int end = 1;
int ans = 0;
while(end < nums.size()){
int maxpos = 0;
for(int i = start; i < end; i++){
maxpos = max(maxpos, i + nums[i]);
}
start = end; //下一次起跳的起始位置
end = maxpos + 1;
ans++;
}
return ans;
}
};