目录
题目
给定一个非负整数数组,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个位置。
示例 1:
输入: [2,3,1,1,4]
输出: true
解释: 从位置 0 到 1 跳 1 步, 然后跳 3 步到达最后一个位置。
示例 2:输入: [3,2,1,0,4]
输出: false
解释: 无论怎样,你总会到达索引为 3 的位置。但该位置的最大跳跃长度是 0 , 所以你永远不可能到达最后一个位置。来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/jump-game
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
运行时间
代码
1.超时的代码
class Solution { public boolean canJump(int[] nums) { int []f=new int[nums.length];//进行标志,0,1,2,分别表示该点不行,可以,不确定 for(int i=0;i<nums.length;i++) { f[i]=2; } f[nums.length-1]=1; return findCanJump(0,nums,f); } private boolean findCanJump(int cur, int[] nums, int[] f) { if(f[cur]!=2) { return f[cur]==1?true:false; } else { if(cur+nums[cur]>=nums.length-1) { f[cur]=1; return true; }else { int furSte=cur+nums[cur]; for(int i=cur+1;i<=furSte;i++) { if(findCanJump(i, nums, f)==true) { f[cur]=1; return true; } } } f[cur]=0; return false; } } }
2.正确的代码
class Solution { public boolean canJump(int[] nums) { int last=nums.length-1;//大概思路就是从后往前思考 ,看能不能到达当前的点 for(int i=nums.length-2;i>=0;i--) { if(i+nums[i]>=last) { last=i; } } return last==0?true:false; } }