一、题目描述
给你一个非负整数数组 nums
,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。你的目标是使用最少的跳跃次数到达数组的最后一个位置。假设你总是可以到达数组的最后一个位置。
示例 1:
输入: nums = [2,3,1,1,4]
输出: 2
示例 2:
输入: nums = [2,3,0,1,4]
输出: 2
二、题解
通过贪心法求解,时间复杂度 O ( n ) O(n) O(n),空间复杂度 O ( 1 ) O(1) O(1):
class Solution {
public:
int jump(vector<int>& nums) {
int cur_max_pos = 0, next_max_pos = 0; // 当前步数能到达的最大下标 和 下一步能到达的最大下标
int step = 0; // 当前步数
/* 这里如果是 i < nums.size() 的话,当刚好能走到最后一个位置时会多加一次统计次数 */
for (int i = 0; i < nums.size() - 1; i++) {
next_max_pos = max(next_max_pos, i + nums[i]); // 更新下一步能到达的最大下标
/* 遍历到当前范围的最后一个位置 也表明当前步数范围无法覆盖末尾元素 即 cur_max_pos < nums.size() - 1 */
if (i == cur_max_pos) {
step++; // 肯定要走下一步了
cur_max_pos = next_max_pos; // 更新当前步数能到达的最大下标
}
}
return step;
}
};