题目描述
解题思路
与 55. 跳跃游戏(贪心策略) 的区别在于,本题要求的是最少步数,而上一道题要求的是是否可到达终点。
由于每次跳跃的位置,可以在给定的最大范围内跳跃,因此只要跳跃到会让后续移动距离更远的哪个位置即可。
局部最优解:当前和后续移动距离尽可能的远,让步数最少
全局最优解:最少步数到达终点。
以当前遍历位置到达最大范围的边界为变化条件,在到达边界范围前,寻找跳到哪个位置会让后续跳跃距离更远。当遍历到最大范围边界时,就以那个位置为新的起点,更新那个位置。
class Solution {
public:
int jump(vector<int>& nums) {
if(nums.size() == 1) return 0;
int res = 0;
int curDistance = 0, nextDistance = 0;
for(int i = 0; i < nums.size(); i++) {
nextDistance = max(nums[i] + i, nextDistance); // 寻找边界内的最优跳跃位置
if(i == curDistance) { // 当前遍历到达可跳跃的最大范围边界
if(curDistance < nums.size() - 1) { // 还未满足条件
res++;
curDistance = nextDistance;
// 更新跳跃范围可跳跃到终点时,直接跳出
if(nextDistance >= nums.size() - 1) break;
}
}
}
return res;
}
};
参考文章:45. 跳跃游戏 II