题目已经保证可以到达nums[n-1],首先解决特殊情况,当n<3时,直接返回n-1。
从0位置开始遍历,end为下一步可以跳到的最远元素下标,max_dist为 i 到end范围内的点可以跳到的最远元素下标。
每次递增,判断并更新max_dist,如果i==end,说明下一步能跳的点已经遍历完了,需要进行跳跃,steps++,跳完之后end = max_dist。此时如果end>=n-1,说明已经可以跳到最后应该元素了,跳出循环,最后返回steps。
class Solution {
public:
int jump(vector<int>& nums) {
int n = nums.size();
if (n < 3)
return n - 1;
int max_dist = 0;
int end = 0;
int steps = 0;
for (int i = 0; i < n; i++) {
max_dist = max(max_dist, i + nums[i]);
if (i == end) {
end = max_dist;
steps++;
if (end >= n - 1)
break;
}
}
return steps;
}
};