leetcode 55. 跳跃游戏 [java/贪心]

194 阅读1分钟

题目

给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。 数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标。

方法一:暴力解法

思路:

因为规定是非负整数数组 nums ,那么只有一种情况会地大不了最后一个下标,那就是下表值为0且0的前面没有值可以跳过这个下标。我们维护一个dp[n]表示可以抵达,当下标值为0,那么下标值+1为false则返回false。

代码

class Solution {
    public boolean canJump(int[] nums) {
        int len = nums.length;
        if(len <= 1){
            return true;
        }
        boolean[] dp = new boolean[len];
        len--;
        for(int i=0; i < len; i++){
            if (i + nums[i] >= len){
                return true;
            }else {
                if (nums[i] != 0){
                    for (int j = i; j <= i + nums[i] ; j++) {
                        dp[j] = true;
                    }
                }else {
                    if (!dp[i + 1]){
                        break;
                    }
                }

            }
        }
        return false;
    }
}

方法一:贪心

思路:

每次从i起跳,抵达最远距离j。那么就表示从i->j全部是可达的记录,当i大于j的时候就表示无法抵达最后一个下标位置了。

代码

class Solution {
    public boolean canJump(int[] nums) {
         int len = nums.length;
        int lenMax = 0;
        for(int i=0; i < len; i++){
            if (i <= lenMax){ //当前的下标i,一定要在可抵达的范围内
                lenMax = Math.max(lenMax,i+nums[i]);//记录最远可以抵达的下标位置
                if (lenMax >= len - 1){ // 已经可以抵达最后一个下标位置
                    return true;
                }
            }else{
                return false;
            }
        }
        return false;
    }
}