LeetCode Hot100 动态规划 55. 跳跃游戏

LeetCode Hot100 动态规划 55. 跳跃游戏_第1张图片

分析:例 nums=[5,3,2,0,8,10]

1 .建立dp[]数组,里面记录可以跳的最远的格子

i 表示格子:第 0 格 ,第 1 格,第 2 格,......,第 nums.length-1 格

dp[0] = i + nums[i] = 0 + 5 = 5,即在i = 0 处最远可以跳到 i=5的格子

dp[1] = i + nums[i] = 1 + 3 = 4,即在i = 1 处最远可以跳到 i=4的格子

dp[1]只可以跳到i = 4,而dp[0]可以跳到i=5  很明显 dp[0] > dp[1]

(我在 1 格子都没有上一个 0 格子跳得远,所以我肯定最后选择在 0 格子跳,而不是 1 格子跳)

2. 即,考虑到状态转移方程,所以dp[1] = max(dp[0],1+nums[1]) = max(5,4) = 5

dp[i] = max(dp[i-1],i+nums[i]) 

3. 最重要的! 最重要的! 最重要的! 最重要的!,还要考虑到能到达我现在的格子吗?,如果到不了的话就表示到不了最后的格子,因为 dp[5] >=dp[4]>=dp[3].....>=dp[0]。

例如 nums = [1,0,2,3] , dp[0] = 1 ,dp[1] = max(dp[0], nums[1] + 0) = 1,这样子看来不管是dp[0],还是dp[1] 都到不了 i = 2这个格子,那就没有必要再继续了。

即:if (i > dp[i-1]) return false;

    public static boolean canJump(int[] nums) {
        if (nums.length == 1) return true;
        if (nums[0] == 0) return false;
        int dp[] = new int[nums.length];//dp里存每次在当前格子能蹦的最远的距离
        dp[0] = nums[0];
        for (int i = 1; i < nums.length; i++) {
            if (dp[i - 1] < i) return false;//从之前任何一个格子跳,都到不了这个格子
            dp[i] = Math.max(dp[i - 1], i + nums[i]);
            System.out.println(dp[i]);
        }
        return dp[dp.length - 1] >= nums.length - 1;//最后能不能到达终点
    }

你可能感兴趣的:(动态规划,leetcode,算法,java)