给出一个非负整数数组,你最初在数组第一个元素的位置
数组中的元素代表你在这个位置可以跳跃的最大长度
判断你是否能到达数组最后一个元素的位置
例如
A =[2,3,1,1,4], 返回 true.
A =[3,2,1,0,4], 返回 false.
/* * 贪心算法的运用 Runtime: 8 ms.Your runtime beats 73.77 % of java submissions. */ public boolean canJump(int[] nums) { // 异常输入 if (nums == null || nums.length < 1) return false; if (nums.length == 1) return true; int last = nums.length - 1; for (int i = nums.length - 2; i >= 0; i--) { if (i + nums[i] >= last) last = i; } return last == 0; }
动态规划,初始第一个index为true,其他全部为false;如果当前index为true则把从当前开始到后面的A[i]个位置都变成true.最后一个index如果为true就说明可以到达。
bool canJump(int A[], int n) {
vector<bool> dp(n,false);
dp[0]=true;
for(int i=0;i<n&&dp[i];i++)
{
for(int j=0;j<=A[i];j++)
dp[i+j]=true;
}
return dp[n-1];
}
class Solution(object): def canJump(self, nums): res = [0] * len(nums) res[0] = 1 for i in range(len(nums)): if res[i] == 0: continue for j in range(1, nums[i] + 1): if i + j < len(nums): res[i + j] = 1 if res[len(nums) - 1] == 1: return True return res[len(nums) - 1] == 1
class Solution(object): def canJump(self, nums): i = 0 limit = 1 #目前最远到不了的下标 while i < limit: limit = max(limit, nums[i] + i + 1) #更新下标 if limit >= len(nums): return True i += 1 return False
class Solution(object): def jump(self, nums): if len(nums) == 1: return 0 i = 0 step_flag = 1 limit = 1 res = 0 while i < limit: if i >= step_flag: res += 1 step_flag = limit limit = max(limit, nums[i] + i + 1) if limit >= len(nums): return res + 1 i += 1
public class Solution { public boolean canJump(int[] A) { if(A == null || A.length <= 0) return false; // 定义一个boolean的数组,判断数组第i是否可达 boolean[] isJump = new boolean[A.length]; isJump[0] = true; for(int i = 0; i < A.length; i++){ if(isJump[i]){ for(int j = 1; j <= A[i]; j++){ // 这里要判断是否越界,超过A.length说明可以到达 if(i + j < A.length) isJump[i + j] = true; else return true; } } } return isJump[A.length - 1]; } }
public class Solution { public boolean canJump(int[] A) { boolean[] flag = new boolean[A.length]; flag[0] = true; for (int i = 0; i < A.length; i ++) { if(flag[i]) { int maxPosition = Math.min(i + A[i], A.length - 1); for (int j = i + 1; j <= maxPosition; j ++) { flag[j] = true; } } if(flag[A.length - 1]) return true; } return false; } }
//深度优先搜索 class Solution { public: bool search(vector<int>& A, int start, int n, int mark[]) { if(start >= n - 1) return true; //if(A[start] == 0) return false; mark[start] = 1; int maxjump = start+A[start]; for(int i = start+1; i <= maxjump; i++) { if(!mark[i] && search(A, i, n, mark)) return true; } return false; } bool canJump(vector<int>& A) { int mark[A.size()]; memset(mark, 0, sizeof(mark)); return search(A, 0, A.size(), mark); } };
//楼上的看起来很简洁,但是等于全部遍历一边,并不好 public boolean canJump(int[] A) { for(int i=0;i<A.length-1;){ int max=i; for(int j=i+1;j<=A[i]+i;j++){ if(j>=A.length-1) return true; max=Math.max(max,j+A[j]); } if(i==max) return false; i=max; } return true; }
# # # @param A int整型一维数组 # @return bool布尔型 # class Solution: def canJump(self , A ): # write code here l = len(A) i = A[0] j = 0 if l == 1: return True else: while i < l - 1: j = A[i] if A[i] == 0: return False else: i += j return True
public class JumpingGame { /** * * @param A int整型一维数组 * @return bool布尔型 */ public boolean canJump (int[] A) { int[] resultList = new int[A.length + 1]; // 为一维数组 resultList 填充初始值 0 Arrays.fill(resultList, 0); // 数组的起始位置一定是可达的 resultList[0] = 1; int len = 0; for (int i = 0; i < A.length - 1; i++) { len = A[i]; // 判断可达点 并且 len > 0 if (len > 0 && resultList[i] == 1) { // 填充 下标为 i + 1 ~ i + len 的值为1, 表示当前的下标点是可以被到达的。 下面的函数fill 中包含起点 i + 1, 不包含终点 i + len + 1 Arrays.fill(resultList, i + 1, (i + len + 1 > A.length ? A.length : i + len + 1), 1); } } return (resultList[A.length - 1] == 1 ? true : false); } }