当前位置: 面试刷题>> 跳跃游戏(经典算法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`,我们更新 `farthest` 为 `max(farthest, i + nums[i])`,即当前能到达的最远距离和从当前位置 `i` 跳跃后能达到的最远距离中的较大值。如果 `farthest` 在任何时候都不小于数组的长度减一(即最后一个位置的索引),那么我们就可以到达数组的最后一个位置,返回 `true`;如果遍历完数组都没有达到这个条件,则返回 `false`。 ### PHP 示例代码: ```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 示例代码: ```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 示例代码: ```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` 变量来跟踪当前能够到达的最远距离,从而判断是否能够到达数组的最后一个位置。
推荐面试题