第一种方式超时
class Solution { public: bool canJump(vector<int>& nums) { if(jump(nums,0)) return true; return false; } bool jump(vector<int> nums,int index){ if(index > nums.size()-1) return false; else if(index == nums.size()-1) return true; else { cout<<"index: "<<index<<endl; bool res =false; for(int i = 1; i<=nums[index];i++){ if(jump(nums,index+i)) res = true; } return res; } } };
如果某一个作为 起跳点 的格子可以跳跃的距离是 3,那么表示后面 3 个格子都可以作为 起跳点。
可以对每一个能作为 起跳点 的格子都尝试跳一次,把 能跳到最远的距离 不断更新。
如果可以一直跳到最后,就成功了。
class Solution { public: bool canJump(vector<int>& nums) { int len = nums.size(); int maxreach = 0; for(int i = 0; i < len; i++){ if(i<=maxreach){ maxreach = max(maxreach, i + nums[i]); if(maxreach>=len-1) return true; } } return false; } };