解法一,递归,超时
class Solution {
public:
bool canJump(vector<int>& nums)
{
if(nums.size()>1&&nums[0]==0)return false;
return jump(nums,0);
}
bool jump(vector<int>& nums,int pos)
{
if(pos==nums.size()-1)
return true;
int len=nums[pos];
if(len==0)
return false;
for(int i=1; i<=len && (pos+i)<nums.size();i++)
{
if(jump(nums,pos+i)==true)
return true;
}
return false;
}
};
解法2-在1的基础上加一个辅助表,记录每次在该位置的true or false
解法3-每一步都确定能够跳跃的最大距离,如果最后一个元素在这个距离内则表示可达;
//贪心算法:每一步都确定能够跳跃的最大距离,如果最后一个元素在这个距离内则表示可达;
class Solution {
public:
bool canJump(vector<int>& nums)
{
int n=nums.size();
int maxJump=-1;
for(int i=0;i<n;i++)
{
if(nums[i]>maxJump)//确定当前能够跳跃的最大距离
maxJump=nums[i];
if(maxJump>=n-1-i)// 最后一个元素在这个距离之内
return true;
if(maxJump==0)
return false;
maxJump--;
}
return false;
}
};