目录

算法随笔_73-跳跃游戏

目录

算法随笔_73: 跳跃游戏

上一篇:

=====

题目描述如下:

给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。

判断你是否能够到达最后一个下标,如果可以,返回 true ;否则,返回 false 。

示例 1:

输入:nums = [2,3,1,1,4]

输出:true

解释:可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。

=====

算法思路:

某个元素 i 能否到达最后一个元素,取决于在元素i 的最大长度范围内是否有可到达最后一个元素的元素j。从中我们可以发现如下的递推关系:

我们设res数组,res[i]表示元素 i 是否能到达最后一个元素,其值为true或false。那么

res[i] = res[i+1] or res[i+2] or …… res[i+nums[i]]

此公式表示只要有一个为真,res[i]即为真。如果都为假,res[i]为假。

但如果我们依次判断nums[i]范围内的元素 i+1,i+2等等,效率较为低下。我们可以通过以下方式解决:

我们从右往左遍历原数组,并维护一个离元素0最近的索引 j,它的res[j]为真,我们设其为near。near的初始值为n-1。

当遍历到元素 i 时,如果nums[i]的最大长度范围包括了near,那res[i]就为真,否则为假。

实际编写代码时,可以完全不需要res数组,只需要维护near变量即可。遍历完成后,如果near等于0,说明能够到达,否则不能到达。

时间复杂度O(n),下面是Python代码实现:

class Solution(object):
    def canJump(self, nums):
        """
        :type nums: List[int]
        :rtype: bool
        """
        n=len(nums)
        near=n-1
        for i in range(n-2,-1,-1):
            if nums[i]+i>= near:
                near=i
        res=True if near==0 else False
        return res

关键词: 动态规划