55. 跳跃游戏

107 阅读2分钟

这是我参与8月更文挑战的第4天,活动详情查看:8月更文挑战

55. 跳跃游戏

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

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

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

示例 1:

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

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

解题思路

  • 对于已经在i下标的,最多可以跳i+nums[i]的距离
  • 我们可以维护一个变量l,代表在遍历前i-1个位置的情况下,最多可以跳多远
  • 如果当前遍历的i小于l,说明当前i是不可达的,既然当前i不可达,那么就没有办法跳得更远,因此就不可能到达最后一个下标.在遍历的过程中,如果 目前可以到达的位置 大于等于数组中的当前遍历的位置,那就说明当前位置可达,可以继续遍历。反之,如果当前位置就是不可达的,我们就返回 False 作为答案。如果可以遍历完所有元素,则是说明最后一个元素是可达的。

对于示例2: [3, 2, 1, 0, 4]

  1. 我们一开始在位置 0,可以跳跃的最大长度为 3,因此最远可以到达的位置被更新为 3;

  2. 我们遍历到位置 1,由于 1≤3,因此位置 1 可达,加上它可以跳跃的最大长度 2 得到 3,没有超过最远可以到达的位置,所以最远距离还是3;

  3. 位置 2、位置 3 同理,最远可以到达的位置不会被更新;

  4. 我们遍历到位置 4,由于4>3,因此位置 4 不可达,我们也就不考虑它可以跳跃的最大长度了。

代码

class Solution {
    public boolean canJump(int[] nums) {

        boolean[] check=new boolean[nums.length];
        int l=0;
        for (int i=0;i<nums.length;i++)
        {
            if (i>l)
                return false;
            l= Math.max(l,i+nums[i]);
        }
        return true;

    }
}