题目描述
解法:(C++)
在 跳跃游戏 中,我们知道有一个很核心的思想就是:如果当前起跳点能跳到后面的某个格子,那么从该起跳点往后的 k k k 个格子都可以跳到那个格子。
那么对这道题来说,因为所有输入都是能保证跳到最后,于是我们将不再关心如何跳使得步数最少,而只关心跳到最后需要最少的步数是多少。
对于前 n − 1 n-1 n−1 个格子,我们每次都试一下从当前格子起跳能到达的最远距离。记 m a x p o s maxpos maxpos 表示我们能跳到的最右边界,因为一定能跳到最后,所以 m a x p o s maxpos maxpos 最后一定是指向末尾元素的。那么当 i = e n d i=end i=end 时,也就是说只需要一次跳跃,我们就能到达 e n d end end 及 e n d end end 之前的任意位置,同时我们更新 e n d end end ( e n d = m a x p o s end = maxpos end=maxpos, e n d end end 最后也必定指向末尾的元素),于是我们就能知道最少用多少步就能跳到最后。
详细参考 Ikaruga的解
class Solution {
public:
int jump(vector<int>& nums) {
int n = nums.size(), maxpos = 0, end = 0, ans = 0;
for(int i=0;i<n-1;i++)
{
maxpos = max(maxpos, i+nums[i]);
if(i==end)
{
end = maxpos;
ans++;
}
}
return ans;
}
};