55. 跳跃游戏 [中等]

59 阅读1分钟

题目

给定一个非负整数数组 nums ,你最初位于数组的 第一个下标

数组中的每个元素代表你在该位置可以跳跃的最大长度。

判断你是否能够到达最后一个下标。

解法一

思路

动态规划

dp[i]表示位置i是否可达,true为可达。

那么dp[i]可以由第j个位置(0..i-1)的位置过来,只要dp[j]可达且i-j<=nums[j]。

代码

class Solution {
    public boolean canJump(int[] nums) {
        // dp[i]表示是否可达,true可达,false不可达
        boolean[] dp = new boolean[nums.length];
        dp[0] = true;
        for (int i = 1; i < nums.length; i++) {
            for (int j = 0; j < i; j++) {
                if (dp[j] && (i - j) <= nums[j]) {
                    dp[i] = true;
                    continue; 
                }
            }
        }

        return dp[nums.length - 1];
    }
}

复杂度

  • 时间复杂度:O(n^2)
  • 空间复杂度:O(n)

解法二

思路

贪心法

代码

class Solution {
    public boolean canJump(int[] nums) {
        int most = 0;
        for (int i = 0; i < nums.length; i++) {
            if (i <= most) {
                most = Math.max(most, i + nums[i]);
            }
            if (most >= nums.length - 1) {
                return true;
            }
        }
        return false;
    }
}

复杂度

  • 时间复杂度:O(n)
  • 空间复杂度:O(1)