题解:
cpp
class Solution {
public:
int jump(vector<int>& nums) {
// maxPos:在当前已进行的跳跃中,能够到达的最远下标
// end:当前这一跳所能到达的最右边界(即当前跳跃的覆盖范围终点)
// step:已经完成的跳跃次数
int maxPos = 0, n = nums.size(), end = 0, step = 0;
// 遍历数组,但不需要处理最后一个元素(n-1),
// 因为只要能到达 n-1 就完成了目标,无需再跳
for (int i = 0; i < n - 1; ++i) {
// 确保当前位置 i 是可达的(题目保证有解,此条件通常恒真,可省略但保留更安全)
if (maxPos >= i) {
// 更新在当前位置 i 能够跳到的最远位置
maxPos = max(maxPos, i + nums[i]);
// 如果到达了当前跳跃的边界(即当前这一步的最远位置),
// 说明必须进行一次新的跳跃,才能继续前进
if (i == end) {
end = maxPos; // 将边界更新为下一步能到达的最远位置
++step; // 跳跃次数加一
}
}
}
return step;
}
};