【27.跳跃游戏】

3 阅读1分钟

题目

给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。

判断你是否能够到达最后一个下标,如果可以,返回 true ;否则,返回 false 。

示例 1:

输入: nums = [2,3,1,1,4]
输出: true
解释: 可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。

题解

方式一:贪心

复杂度:O(n)

public boolean canJump(int[] nums) {
    int len = nums.length;
    if (len == 1) {
        return true;
    }
    int min = 1; // 当前位置必须满足的条件,即 nums[i] >= min 才能到达终点
    for (int i = len - 2; i >= 0; i--) {
        if (i == 0 && nums[i] < min) {
            // nums[0] 不满足,无法到达终点
            return false;
        }
        if (nums[i] >= min) {
            // nums[i] 满足,那么nums[i - 1]只需要保证能到nums[i]即可
            min = 1;
        } else {
            // nums[i - 1]需要跳到上一个满足的下标才行
            min++;
        }
    }
    return true;
}

方式二:贪心

复杂度:O(n)

public boolean canJump(int[] nums) {
    int len = nums.length;
    int rightmost = 0; // 最远能到达的位置
    for (int i = 0; i < len - 1; i++) {
        if (i <= rightmost) {
            // i 是能够到达的,更新最远位置
            rightmost = Math.max(rightmost, nums[i] + i);
            // 更新完如果已经能到达终点,结束
            // 相比第一种方式可以更早的结束遍历
            if (rightmost >= len - 1) {
                return true;
            }
        }
    }
    return false;
}

总结

算法:贪心