和我一起迎接明天的太阳吧

klaus08

焦虑源于行动的匮乏

LeetCode-55-跳跃游戏

原题链接


描述

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

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

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


示例

示例 2:

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


思路一

动态规划。首先假设终点是 i,在到达终点的前一个状态所在的是 j(如果存在的话),到达终点时只有一种情况:j < i 并且 nums[ j ] >= i - j。而初始状态,只有 k 中可能,k 是 num[0] 的数。


解答一

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

思路二

贪心。在每个地方总是选择走得最远的长度并记录,当该长度大于等于 nums.length - 1 的时候说明可以到达最后一个下标从头开始遍历数组,比较从当前点走的最大长度和和已知的最大长度max比较,更新max 使总是当前最大。


解答二

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

    public static void main(String[] args) {
        int[] a = {2,3,1,1,4};
        System.out.println(canJump(a));
    }
}
posted @ 2021-08-24 20:44  klaus08  阅读(33)  评论(0)    收藏  举报