【两次过】Lintcode 116. 跳跃游戏

版权声明:本文为博主原创文章,未经博主允许不得转载。 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];
    }
}

猜你喜欢

转载自blog.csdn.net/majichen95/article/details/83053955