题目:给你一个非负整数数组 nums ,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。你的目标是使用最少的跳跃次数到达数组的最后一个位置。假设你总是可以到达数组的最后一个位置。
题解:贪心算法,局部最优:当前可移动距离尽可能多走,如果还没到终点,步数再加一。整体最优:一步尽可能多走,从而达到最小步数;写代码的时候不可以一次想走多少就走多少。最小的步数增加覆盖范围,覆盖范围一旦覆盖了终点,得到的就是最小步数。要有两个覆盖范围,这一个覆盖范围和下一个覆盖范围。
class Solution {
public:
int jump(vector<int>& nums) {
if (nums.size()==1) return 0;
int curStep=0;
int ans=0;
int nextStep=0;
for (int i=0;i<nums.size();i++) {
nextStep=max(nums[i]+i,nextStep);
if (i==curStep) {
if (curStep!=nums.size()-1) {
ans++;
curStep=nextStep;
if (nextStep>=nums.size()-1) break;
} else break;
}
}
return ans;
}
};