Skip to content

跳跃游戏

题目描述

给定一个非负整数数组,你最初位于数组的第一个位置。

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

判断你是否能够到达最后一个位置。

题目链接:https://leetcode.cn/problems/jump-game/

文章讲解:https://programmercarl.com/0055.跳跃游戏.html

思考

贪心解法

示例 1:

  • 输入: [2,3,1,1,4]
  • 输出: true
  • 解释: 我们可以先跳 1 步,从位置 0 到达 位置 1, 然后再从位置 1 跳 3 步到达最后一个位置。

从示例开始思考,

首先在位置0,这个位置上可以跳1步可以跳2步,我们的覆盖范围是位置2,如果我跳一步,我的覆盖范围就更新为位置4,如果跳两步,覆盖范围就是位置3。

我们会发现,跳两步反而距离短了,所以这时候我们不跳两步,或者说我们跳两步,但仍记录此时的最大覆盖范围。即一直保持最大的覆盖范围。

如果某次,覆盖范围到了终点,那么就认为可以到达最后一个位置。

思路就是:

每次移动都移动一步,此时更新最大覆盖范围。直到覆盖范围到达终点。

局部最优解:每次移动都选择最大的覆盖范围

代码实现

C++
bool canJump(vector<int>& nums){
    int cover = 0;
    for(int i = 0;i<=cover;i++){
        cover = cover > (i + nums[i]) ? cover : (i + nums[i]);
        if(cover >= nums.size()-1) return true;
    }
    return false;
}