一开始的想法是用backtracking 遍历每种走法 level>=数组最大位置则return true 但这么写会超时。
bool DFS(vector<int>& nums,int level,int n)
{
if(level >= n)return true;
else{
for(int i = 1;i<=nums[level];i++)
if(DFS(nums,level+i,n))return true;
}
return false;
}
bool canJump(vector<int>& nums) {
int n = nums.size()-1;
return DFS(nums,0,n);
}
后来明白我们并不关心如何走到最后一个位置,我们只关心能不能走到,既只需要知道每个位置最远能走到哪里,将这个最远的值存在reach中,若i>reach(最远不能走到i位置)则不能走到最后一个位置,若reach>=nums.size()-1 -1 则说明可以走到最后一个位置。
bool canJump(vector<int>& nums){
int n = nums.size();
int reach = 0;
for(int i=0;i<n;i++)
{
if(i>reach||reach>=n-1)break;
reach = max(reach,i+nums[i]);
}
return reach>=n-1;
}