当前位置: 面试刷题>> 跳跃游戏(经典算法150题)


题目描述:

跳跃游戏(Jump Game)

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

例如,给定数组 nums = [2,3,1,1,4],从位置 0 开始,你可以跳到位置 2(因为 nums[0] 是 2),然后从位置 2 你可以跳到位置 3,从位置 3 你可以跳到位置 4(因为 nums[3] 是 1,虽然它不大于 3,但足够你跳到位置 4)。因此,返回 true

解题思路:

这个问题可以通过贪心算法来解决。我们从左到右遍历数组,同时维护一个变量(比如叫 farthest),它表示在当前位置能够到达的最远距离。每当我们遇到一个位置 i,我们更新 farthestmax(farthest, i + nums[i]),即当前能到达的最远距离和从当前位置 i 跳跃后能达到的最远距离中的较大值。如果 farthest 在任何时候都不小于数组的长度减一(即最后一个位置的索引),那么我们就可以到达数组的最后一个位置,返回 true;如果遍历完数组都没有达到这个条件,则返回 false

PHP 示例代码:

function canJump($nums) {
    $n = count($nums);
    $farthest = 0;
    for ($i = 0; $i < $n - 1; $i++) { // 注意这里只需要遍历到倒数第二个元素
        $farthest = max($farthest, $i + $nums[$i]);
        if ($farthest < $i) { // 如果当前能到达的最远距离连自己都跳不过去,则提前结束
            return false;
        }
    }
    return true;
}

Python 示例代码:

def canJump(nums):
    farthest = 0
    for i in range(len(nums) - 1):  # 同样,只需要遍历到倒数第二个元素
        farthest = max(farthest, i + nums[i])
        if farthest <= i:  # 如果当前能到达的最远距离连自己都跳不过去,则提前结束
            return False
    return True

JavaScript 示例代码:

function canJump(nums) {
    let farthest = 0;
    for (let i = 0; i < nums.length - 1; i++) { // 遍历到倒数第二个元素
        farthest = Math.max(farthest, i + nums[i]);
        if (farthest <= i) { // 如果当前能到达的最远距离连自己都跳不过去,则提前结束
            return false;
        }
    }
    return true;
}

这些代码示例都使用了贪心算法来解决跳跃游戏问题,通过维护一个 farthest 变量来跟踪当前能够到达的最远距离,从而判断是否能够到达数组的最后一个位置。

推荐面试题