跳跃游戏 II

给定一个长度为 n0 索引整数数组 nums。初始位置为 nums[0]

每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说,如果你在 nums[i] 处,你可以跳转到任意 nums[i + j] 处:

  • 0 <= j <= nums[i]
  • i + j < n

返回到达 nums[n - 1] 的最小跳跃次数。生成的测试用例可以到达 nums[n - 1]


这个有点难度,不会写。

要求最小跳跃次数,也就是每次尽可能多走。

元素nums[i]的覆盖范围是**[i,i+nums[i]]**,也就是从i位置能跳到的位置,每次跳跃到覆盖范围最大的位置就可以保证步数最小。

设置覆盖范围的右端点为end,i==end时,说明覆盖范围遍历完,跳跃次数+1.同时在遍历过程中,求出覆盖范围内的元素的最大覆盖范围,并更新end,也就是跳跃整个最大覆盖范围。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Solution {
public:
int jump(vector<int>& nums) {
int n=nums.size();
int max_jump=0;
int end=nums[0];
int ans=0;
if(nums.size()==1) return 0;
for(int i=0;i<n;i++){
max_jump=max(max_jump,i+nums[i]);
if(i==end){
end = max_jump;
ans++;
if(end>=n-1) break;
}
}
return ans;
}
};