贪心法可解,尚可不用动态规划。每次都取当时能调到最远的点
package Level3;
/**
* Jump Game
* Given an array of non-negative integers, you are initially positioned at the first index of the array.
Each element in the array represents your maximum jump length at that position.
Determine if you are able to reach the last index.
For example:
A = [2,3,1,1,4], return true.
A = [3,2,1,0,4], return false.
*/
public class S55 {
public static void main(String[] args) {
// int[] A = {0}; // 特殊的case
// int[] A = {2,3,1,1,4};
int[] A = {3,2,1,0,4};
System.out.println(canJump(A));
}
// 贪心法,每次都取当时能调到最远的点
public static boolean canJump(int[] A) {
int pos = 0;
while(true){
int jump = A[pos];
if(pos+jump < A.length-1){ // 还没跳到最后一个位置时
pos += jump;
}else{ // 已经跳到了最后一个位置或之后了
return true;
}
if(jump == 0){ // 没有progress
return false;
}
}
}
}
递归:
public class Solution {
public boolean canJump(int[] A) {
return canJumpRec(A, A.length-1);
}
public boolean canJumpRec(int[] A, int pos) {
if(pos <= 0){
return true;
}
for(int i=0; i<pos; i++) {
if(i+A[i] >= pos) {
return canJumpRec(A, i);
}
}
return false;
}
}
DP:
public class Solution {
public boolean canJump(int[] A) {
for(int i=1; i<A.length; i++) {
boolean pass = false;
for(int j=0; j<i; j++) {
if(j+A[j] >= i) {
pass = true;
break;
}
}
if(!pass) {
return false;
}
}
return true;
}
}