深搜+剪枝
class Solution {
public:
void Jump(vector<int>& nums,int sta,bool vist[],bool& tag)
{
if(sta>=nums.size()-1||sta+nums[sta]>=nums.size()-1)
{
tag=true;
return;
}
if(tag==true||vist[sta+nums[sta]])
return;
for(int i=nums[sta];i>=1;i--)
{
if(vist[sta+i])
break;
Jump(nums,sta+i,vist,tag);
vist[sta+i]=true;
}
}
bool canJump(vector<int>& nums) {
int n=nums.size();
bool tag=false;
bool vist[n+1];
memset(vist,0,sizeof(vist));
Jump(nums,0,vist,tag);
return tag;
}
};
贪心,纪录最远能到达的距离,O(n)
class Solution {
public:
bool canJump(vector<int>& nums) {
int n=nums.size();
int rightmost=1;
for(int i=0;i<nums.size();i++)
{
rightmost--;
if(i+rightmost>=nums.size()-1)
return true;
if(nums[i]>rightmost)
rightmost=nums[i];
if(rightmost==0)
return false;
}
return true;
}
};