版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/majichen95/article/details/83053955
给出一个非负整数数组,你最初定位在数组的第一个位置。
数组中的每个元素代表你在那个位置可以跳跃的最大长度。
判断你是否能到达数组的最后一个位置。
样例
A = [2,3,1,1,4],返回 true.
A = [3,2,1,0,4],返回 false.
注意事项
这个问题有两个方法,一个是贪心
和 动态规划
。
贪心
方法时间复杂度为O(N)
。
动态规划
方法的时间复杂度为为O(n^2)
。
我们手动设置小型数据集,使大家可以通过测试的两种方式。这仅仅是为了让大家学会如何使用动态规划的方式解决此问题。如果您用动态规划的方式完成它,你可以尝试贪心法,以使其再次通过一次。
解题思路1:
动态规划。
确定状态:
扫描二维码关注公众号,回复:
3641596 查看本文章
最后一步:如果能跳到最后一块石头n-1, 我们考虑它跳的最后一步。这一步是从石头j跳过来的,j<n-1
并且最后一步不超过跳跃的最大距离:n-1-j<=Aj
子问题:设dp[i]表示能不能跳到石头i,则状态方程:
dp[i] = OR(0<=j<i) (dp[j] && i-j<=A[j])
初始条件:
dp[0] = true
时间复杂度为O(n^2)
public class Solution {
/**
* @param A: A list of integers
* @return: A boolean
*/
public boolean canJump(int[] A) {
// write your code here
if(A==null || A.length==0)
return false;
boolean[] dp = new boolean[A.length];
dp[0] = true;
for(int i=1 ; i<dp.length ; i++){
dp[i] = false; //先初始化为false,只要下方条件有一个为true,则为true。对应状态方程的OR条件
for(int j=0 ; j<i ; j++){
dp[i] = (dp[j] && i-j<=A[j]) || dp[i];
}
}
return dp[dp.length-1];
}
}