LeetCode-45. 跳跃游戏 II (中等)
题目地址:https://leetcode-cn.com/problems/jump-game-ii
文章目录
1. 题目描述及示例
给你一个非负整数数组 nums ,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。你的目标是使用最少的跳跃次数到达数组的最后一个位置。假设你总是可以到达数组的最后一个位置。
示例一:
示例二:
2. 题解和代码实现
在这里典型的使用贪心算法。跳跃游戏有第一种判断能否跳到最后leetcode-55. 跳跃游戏;该题是在上述一题的基础上进行提出来,进行寻找跳到最后所用的最少的跳跃次数,已经给出,肯定能跳到最后。
首先我们得明白,对于nums = [2,3,1,1,4] ,当跳到第一步,它最远能够跳到坐标为2的位置(在这里以坐标0为起点),那么也即是第一步nums[1]和nums[2]均能抵达;那么第二步最远能到跳到那里,即max(nums[1]+1,nums[2]+1),所以一直到第x步,到达或超过最后的位置,在这里的每一步,都是尽可能的跳的更远,所以是典型的贪心算法。
代码实现(C++ 2022-3-15)
class Solution {
public:
int jump(vector<int>& nums) {
int length = nums.size(), count = 0, farthest = 0,end = 0;
//只有一个位置,直接到达,需要进行定义
if(length == 1){
return 0;
}
// 进入循环
for(int i=0;i<length;i++){
if(farthest>=i){
// 求解每一步最远之前的所能到达的最远距离
farthest = max(farthest,i+nums[i]);
// 循环到该步的最远位置
if(i==end){
// 进入下一步的最远界定限
end = farthest;
count++;
}
}
// 判断最终的是否超出该数组的位置
if(end>=length-1)
break;
}
return count;
}
};
3. 总结
对于代码的整体思路欢迎与大家一起讨论交流。