跳跃游戏 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;
}
};

2025/2/10更新

想象成小人走桥,走到当前桥的终点后就不得不换个桥,应该换到下一个桥。而且是能够延申最远的一个桥。

跳跃次数就相当于走过的桥的个数

1
2
3
4
2,3,1,1,4
-----curEnd
---
-------curNext
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Solution {
public int jump(int[] nums) {
int n = nums.length;
if (n == 1)
return 0;
int curEnd = 0;
int curNext = 0;
int res = 0;
for (int i = 0; i < n; i++) {
curNext = Math.max(curNext, nums[i] + i);
if (curEnd == i) {
res++;
curEnd = curNext;
if (curEnd >= n - 1) {
break;
}
}
}
return res;

}
}