题目描述
给定一个长度为 n 的 0 索引整数数组 nums。初始位置在下标 0。
每个元素 nums[i] 表示从索引 i 向后跳转的最大长度。 如果你在索引 i 处,可以跳转到任意 i+j
核心思路
这道题的贪心思路本质上等价于BFS 层序遍历: 把每一次跳跃看作一层。
- 在当前一层覆盖的区间内,不断更新能跳到的最远下标
- 当遍历走到当前层的边界时,代表这一层已经全部探索完毕,必须进行一次跳跃,更新下一层的边界
- 一旦边界覆盖到数组末尾,直接结束,得到最小步数
贪心选择:在当前能到达的区间里,尽可能找到跳得最远的位置,从而减少总跳跃次数。
为什么贪心可以得到最小步数? 要步数最少,每一跳就要最大化覆盖范围,这是局部最优推出全局最优。
cpp
class Solution {
public:
int jump(vector<int>& nums) {
int n=nums.size();
if(n==1)
return 0;
int step = 0;
int end = 0;
int maxReach = 0;
for(int i=0;i<n;i++){
maxReach=max(maxReach,i+nums[i]);
if(i == end)
{
step++;
end = maxReach;
if(end >= n-1) break;
}
}
return step;
}
};