给定一个非负整数数组,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
你的目标是使用最少的跳跃次数到达数组的最后一个位置。
示例:
输入: [2,3,1,1,4]
输出: 2
解释: 跳到最后一个位置的最小跳跃数是 2。
从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。
说明:
假设你总是可以到达数组的最后一个位置。
这道题比上一道要考虑的多一点。 首先我们0点肯定是要跳的,次数+1。我们维护我们最远可以跳到的位置,假设我们0点最远可以调到4点。 当2,3,4这两个点最远可以到达6点,那么我们当前维护的最远距离肯定是6点吧。但是我们0点是不可能直接跳到6点的,因为最远到4点。我们需要中途跳一次,具体在哪跳的我们不需要关心,无论是2,3,4任何一个点,我们都是可以到达的。所以我们假设是在最远处的点4跳的,这样可以保证最大值。因此更新ans+1.重复操作。
#include<iostream>
#include<stdio.h>
#include<vector>
#include <map>
#include<string.h>
#include<math.h>
using namespace std;
bool canJump(vector<int>& nums) {
int ans=0;
int n=nums.size();
int l=0;
int endd=0;
for(int i=0;i<n-1;i++)
{
l=max(l,i+nums[i]);
if(i==endd)
{
ans++;
endd=l;
}
}
return ans;
}
int main()
{
vector<int>t,s;
t.push_back(2);
t.push_back(3);
t.push_back(1);
t.push_back(1);
t.push_back(4);
cout<<canJump(t)<<endl;
}