给出一个非负整数数组,你最初定位在数组的第一个位置。
数组中的每个元素代表你在那个位置可以跳跃的最大长度。
判断你是否能到达数组的最后一个位置。
注意事项
这个问题有两个方法,一个是贪心和 动态规划。
贪心方法时间复杂度为O(N)。
动态规划方法的时间复杂度为为O(n^2)。
我们手动设置小型数据集,使大家阔以通过测试的两种方式。这仅仅是为了让大家学会如何使用动态规划的方式解决此问题。如果您用动态规划的方式完成它,你可以尝试贪心法,以使其再次通过一次。
样例
A = [2,3,1,1,4],返回 true.
数组中的每个元素代表你在那个位置可以跳跃的最大长度。
判断你是否能到达数组的最后一个位置。
注意事项
这个问题有两个方法,一个是贪心和 动态规划。
贪心方法时间复杂度为O(N)。
动态规划方法的时间复杂度为为O(n^2)。
我们手动设置小型数据集,使大家阔以通过测试的两种方式。这仅仅是为了让大家学会如何使用动态规划的方式解决此问题。如果您用动态规划的方式完成它,你可以尝试贪心法,以使其再次通过一次。
样例
A = [2,3,1,1,4],返回 true.
A = [3,2,1,0,4],返回 false.
import java.util.Scanner;
/**
* 给出一个非负整数数组,你最初定位在数组的第一个位置。
数组中的每个元素代表你在那个位置可以跳跃的最大长度。
判断你是否能到达数组的最后一个位置。
注意事项
这个问题有两个方法,一个是贪心和 动态规划。
贪心方法时间复杂度为O(N)。
动态规划方法的时间复杂度为为O(n^2)。
我们手动设置小型数据集,使大家阔以通过测试的两种方式。这仅仅是为了让大家学会如何使用动态规划的方式解决此问题。如果您用动态规划的方式完成它,你可以尝试贪心法,以使其再次通过一次。
样例
A = [2,3,1,1,4],返回 true.
A = [3,2,1,0,4],返回 false.
*
* @author Dell
*
*/
public class Test116 {
//动态规划1
public static boolean canJump(int[] A)
{
boolean[][] dp=new boolean[A.length][A.length];
for(int i=0;i<=A.length-1;i++)
{
dp[i][i]=true;
}
for(int j=1;j<=A.length-1;j++)
{
for(int i=j-1;i>=0;i--)
{
if(A[i]>=(j-i))
dp[i][j]=true;
else
{
for(int k=i+1;k<j;k++)
{
dp[i][j]=dp[i][j]||(dp[i][k]&&dp[k][j]);
}
}
}
}
return dp[0][A.length-1];
}
//动态规划2
public static boolean canJump1(int[] A)
{
boolean[] dp=new boolean[A.length];
dp[0]=true;
for(int i=1;i<A.length;i++)
{
for(int j=0;j<i;j++)
{
if(dp[j]&(A[j]>=(i-j)))
{
dp[i]=true;
break;
}
}
}
return dp[A.length-1];
}
//贪心算法
public static boolean canJump2(int[] A)
{
int reach=A[0];
for(int i=1;i<A.length&&reach>=i;i++)
{
if(i+A[i]>reach)
{
reach=i+A[i];
}
}
return reach>=(A.length-1)? true:false;
}
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int[] a=new int[n];
for(int i=0;i<n;i++)
{
a[i]=sc.nextInt();
}
System.out.println(canJump1(a));
}
}