题目

思路
首先我们先明确:题目条件提示我们总是可以到达最后一个节点,那么该题与跳跃游戏之间有什么不同呢?首先本题已经假设我们总是可以到达最后一个点,所以我们不用再判断是否可以到达最后一个位置,其次,本题要求跳跃次数最少,那么我们如何从跳跃游戏的相关思路解决这道题呢?
要求跳跃次数最少,那么本质上还是每次都要尽量跳最远,,那么我们如何选择跳跃策略呢?答案是:在范围内选择一个可以跳更远的点进行跳跃
相关代码如下:
class Solution {
public:
int jump(std::vector<int>& nums) {
if (nums.size() < 2){
return 0;//如果数组长度小于2,那么不用跳跃
}
int current_max_index = nums[0];//当前可达到的最远位置,设定每次选择跳跃点的遍历范围
int pre_max_max_index = nums[0];//遍历当前范围中,可以达到的最远位置
int jump_min = 1;//这里默认跳了一步,即已经设定了范围
for (int i = 1; i < nums.size(); i++){
if (i > current_max_index){//如果i扫描到已经到达界限,那么要跳跃
jump_min++;
current_max_index = pre_max_max_index;//跳跃次数+1,并且更新范围
}
pre_max_max_index =max(pre_max_max_index, nums[i] + i);//每次都更新当前范围中,可以到达的最远位置
}
return jump_min;
}
};
总结
本题类似于前面的跳跃游戏,也是采用贪心算法,在当前范围内选择可以跳更远的点进行跳跃
本文介绍了一个类似于跳跃游戏的问题,但目标是最小化跳跃次数。通过使用贪心算法,每次选择能跳得最远的点进行跳跃,从而找到达到最后一个节点所需的最小跳跃次数。文中提供了一个C++实现的示例代码。
825

被折叠的 条评论
为什么被折叠?



