给定一个非负整数数组,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
你的目标是使用最少的跳跃次数到达数组的最后一个位置。
示例:
输入: [2,3,1,1,4]
输出: 2
解释: 跳到最后一个位置的最小跳跃数是 2。从下标为 0 跳到下标为 1 的位置,跳 1步,然后跳 3步到达数组的最后一个位置。
说明:
假设你总是可以到达数组的最后一个位置。
本来想的是从后往前,计算最靠前的能一步到达尾部的下标,然后跳数加一,把最靠前的这个下标当做数组尾部元素,算递归吧。但是最差成了O(N2),后面想贪婪应该可以做,看似俩循环嵌套,但是实际只有O(n),思想就是在a[0]地方计算最远可以跳到a[i1](一步),在1到i闭区间计算区间内所有值最远可以跳多远a[i2](即两步跳多远)在i1+1到i2计算第三步。。。第四步知道最远跳到n-1;代码如下:
class Solution {
public:
int jump(vector<int>& nums) {
if(nums.empty()) return 0;
if(nums.size()==1) return 0;
int k=nums[0]+0;
int last_max=0;
int max_ad=k;
int max=max_ad;
int step=1;
while(max_ad<nums.size()-1){
for(int i=last_max+1;i<=max_ad;i++){
if(nums[i]+i>=max) max=nums[i]+i;
}
last_max=max_ad;
max_ad=max;
step++;
}
return step;
}
};