与跳跃游戏Ⅰ的思路基本类似还是使用贪心算法,因为使用的是C++语言,所以分析方法二。
因为需要在最少得步数到达终点,使用贪心算法进行正向的查找,每次找到可以到达的最远的位置。
设定maxposition为可以到达的最远位置,使用max函数,maxpos = max(maxpos, i + nums[i]),在遍历过程中,更新maxpos的值,即可以到达的最远的位置的值。
循环的结束条件,或者说跳跃的结束条件是我们可以到达的最远位置大于等于数组的元素个数,所以我们在遍历时,不遍历最后一个元素,因为如果遍历到最后一个元素,循环过程中还会跳跃一步到后面的元素,这是不必要的,还会增加一个不必要的步数,因此不访问最后一个元素。
class Solution {
public:
int jump(vector<int>& nums) {
int maxpos = 0, n = nums.size(), end = 0, step = 0;
//maxpos为可以到达的最远位置,end是上次跳跃后的右边界点是数组的索引,step为跳跃的次数
for (int i = 0; i < n - 1; ++i) {
if (maxpos >= i) {
maxpos = max(maxpos, i + nums[i]);//更新后到达右边界点
if (i == end) {
end = maxpos;//更新右边界点
++step;// 更新步数
}
}
}
return step;
}
};