leetcode-55. 跳跃游戏 力扣 Java版本

给定一个非负整数数组,你最初位于数组的第一个位置。

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

判断你是否能够到达最后一个位置。

示例 1:

输入: [2,3,1,1,4]
输出: true
解释: 从位置 0 到 1 跳 1 步, 然后跳 3 步到达最后一个位置。

实例二

输入: [3,2,1,0,4]
输出: false
解释: 无论怎样,你总会到达索引为 3 的位置。但该位置的最大跳跃长度是 0 , 所以你永远不可能到达最后一个位置。

package leetcode;

/**
 * @author 江河
 * @date 2019-09-26 09:38
 * DP?或是DFS BFS是个dp问题
 * 读题有误
 */
public class leetcode55 {
  public static void main(String[] args) {
    int[] nums = new int[] {1,1,2,1};
    boolean ss = canJump(nums);
    System.out.println(ss);
  }
  public static boolean canJump(int[] nums){
    /**
     * 下面利用动态规划思想来做
     * 动态规划的时间复杂度是O(n^2),空间复杂度是O(n)。
     * 从前往后
     */
//    if (nums == null) {
//      return false;
//    }
//    boolean[] dp = new boolean[nums.length];
//    dp[0] = true;
//    for (int i = 1; i < nums.length; i++) {
//      //能从0到i能访问的节点都置为true
//      for (int j = 0; j < i; j++) {
//        // 如果之前的j节点可达,并且从此节点可以到跳到i
//        if (dp[j] && nums[j] + j >= i) {
//          dp[i] = true;
//          break;
//        }
//      }
//    }
//    return dp[nums.length - 1];
    /**
     * 贪心算法,从最后一个数往前推
     * 分析上面的代码,可以看出使用动态规划的时间复杂度是O(n^2),空间复杂度是O(n)。
     *
     * 下面我们使用贪心的思路看下这个问题,我们记录一个的坐标代表当前可达的最后节点,这个坐标初始等于nums.length-1,
     * 然后我们每判断完是否可达,都向前移动这个坐标,直到遍历结束。
     * 如果这个坐标等于0,那么认为可达,否则不可达。
     * 这段代码的时间复杂度是O(n),空间复杂度是O(1)
     */

    if (nums == null) {
      return false;
    }
    int lastPosition = nums.length - 1;
    for (int i = nums.length - 1; i >= 0; i--) {
      // 逐步向前递推。利用nums[i]==k 从i可以后退最大步为i+k
      if (nums[i] + i >= lastPosition) {
        lastPosition = i;
      }
    }
    return lastPosition == 0;
  }
}

 

你可能感兴趣的:(leetcode)