给出一个非负整数数组,你最初在数组第一个元素的位置
数组中的元素代表你在这个位置可以跳跃的最大长度
判断你是否能到达数组最后一个元素的位置
例如
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);
}
}