题目
给你一个非负整数数组 nums
,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
你的目标是使用最少的跳跃次数到达数组的最后一个位置。
假设你总是可以到达数组的最后一个位置。
示例 1:
输入: nums = [2,3,1,1,4]
输出: 2
解释: 跳到最后一个位置的最小跳跃数是 2。
从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。
示例 2:
输入: nums = [2,3,0,1,4]
输出: 2
提示:
1 <= nums.length <= 10^4
-
解题方法
贪心
局部最优:每一步走到最远距离
全局最优:最远距离的组合
不用考虑下一个跳跃点具体在哪里,只需要考虑每次跳跃所能达到的最远覆盖距离即可。- 使用
mostright
表示当前跳跃能达到的最远距离,初始值为0
- 使用
next
表示下次跳跃能达到的最远距离,初始值为0
- 使用
idx
遍历数组,当idx = mostright
时,使用next
更新mostright
,并对步数加1
- 使用
num
表示跳跃步数,初始值为0
- 使用
时间复杂度O(n)
,空间复杂度O(1)
C++代码:
class Solution {
public:
int jump(vector<int>& nums) {
int num = 0;
int mostright = 0;
int next = 0;
int idx = -1;
while(mostright<nums.size()-1) {
idx++;
next = max(next, nums[idx]+idx);
if(idx==mostright) {
mostright = next;
num++;
}
}
return num;
}
};