从零刷算法-跳跃游戏

90 阅读1分钟

「这是我参与2022首次更文挑战的第22天,活动详情查看:2022首次更文挑战」。

题目描述

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

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

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

示例 1:

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

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

提示:

1 <= nums.length <= 3 * 104 0 <= nums[i] <= 105

题目链接:[55. 跳跃游戏]

思路介绍

以[2, 3, 1, 1, 4]为例,我们的目标是到达最后一个位置。 1、因为倒数第二个位置为1,所以从倒数第二个位置可以到达最后一个位置。因此只要我们能到达倒数第二个位置就能到达最后一个位置。 2、因为倒数第三个位置为1,所以从倒数第三个位置可以到达倒数第二个位置。因此只要我们能到达倒数第三个位置就能到达倒数第二个位置从而能到达最后一个位置。 3、因为倒数第四个位置为3,所以从倒数第四个位置可以到达倒数第三个位置。因此只要我们能到达倒数第四个位置就能到达倒数第三个位置从而能到达最后一个位置。 4、因为倒数第五个位置为2,所以从倒数第五个位置可以到达倒数第四个位置。因此只要我们能到达倒数第五个位置(也就是第一个位置)就能到达倒数第三个位置从而能到达最后一个位置。 因此,我们用一个变量pos来表示需要到达的位置,并初始化为nums.length - 1表示需要到达的位置为最后一个位置。然后从nums.length - 2向前遍历,if(nums[i] + i >= pos)表示从当前位置出发能够到达pos,因此只要能到达当前位置i就可以到达pos,因此可以更新pos为i的值。遍历到最后如果pos==0,也就表示从开始能够跳到末尾。

代码

public boolean canJump(int[] nums) {
        if (nums == null || nums.length == 0) {
            return false;
        }
        //pos表示需要到达的位置
        int pos = nums.length - 1;
        for (int i = nums.length - 2; i >= 0; i--) {
            if (nums[i] + i >= pos) {
                pos = i;
            }
​
        }
        return pos == 0;
​
    }
​

运行结果

执行结果:通过

执行用时:1 ms,

内存消耗:41.5MB