55. 跳跃游戏

Posted 炫云云

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了55. 跳跃游戏相关的知识,希望对你有一定的参考价值。

55. 跳跃游戏

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

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

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

示例 1:

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

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

贪心遍历

核心特性:如果能够到达当前位置,那么也就一定能够到达当前位置的左边所有位置

  1. 对每一个能作为 起跳点 的格子都尝试跳一次,把 能跳到最远的距离 不断更新
  2. 如果可以一直跳到最后,就成功了
class Solution:
    def canJump(self, nums: List[int]) -> bool:
        k = 0 #k为当前能够到达的最大位置
        for i in range(len(nums)):
            if i>k: # 【关键】遍历元素位置下标大于当前能够到达的最大位置下标,不能到达
                return False 
            #能够到达当前位置,看是否更新能够到达的最大位置k
            k = max(k ,nums[i]+i)
        # 跳出则表明能够到达最大位置
        return True
class Solution:
    def canJump(self, nums: List[int]) -> bool:
        if not nums:
            return False
        length = len(nums)
        k = 0 #k为当前能够到达的最大位置索引
        # 从第一个位置开始,是否可以一直跳到最后一个位置 
        
        for i in range(length):
            if i>k: # 【关键】遍历元素位置下标大于当前能够到达的最大位置下标,不能到达
                return False 
            #能够到达当前位置,看是否更新能够到达的最大位置k
            k = max(k ,nums[i]+i)
            #如果最远距离已经大于或等于最后一个元素的下标,则说明能跳过去,退出. 减少循环
            if k>=(length-1): 
                return True 
        # 最远距离k不再改变,且没有到末尾元素
        return False

动态规划

定义 d p [ i ] dp[i] dp[i] 表示 i i i 位置可以跳出的最远距离

初始化: d p [ 0 ] = n u m s [ 0 ] dp[0]=nums[0] dp[0]=nums[0]

迭代:

  • 如果能通过 第 i − 1 i-1 i1 个位置跳出的最远距离 > = i >=i >=i​ ,即 d p [ i − 1 ] > = i , dp[i-1]>=i , dp[i1]>=i, 那么可以跳出的最远距离 d p [ i ] = m a x ( d p [ i − 1 ] , i + n u m s [ i ] ) dp[i]=max(dp[i-1], i+nums[i]) dp[i]=max(dp[i1],i+nums[i])​​ ,
  • 否则,表示它不能到达该位置, i i i 位置可以跳出的最远距离由前面元素决定,即 d p [ i ] = d p [ i − 1 ] dp[i]=dp[i-1] dp[i]=dp[i1]
class Solution:
    def canJump(self, nums: List[int]) -> bool:
        dp=[0 for _ in range(len(nums))]
        dp[0]=nums[0]
        n = len(nums)
        for i in range(1,n):
            if dp[i-1]>=i: 
                dp[i]=max(dp[i-1], i+nums[i])
            else: 
                dp[i]=dp[i-1]
            if dp[i] <= 0 and i < n-1:
                return False
        return dp[-1]>=n-1


参考

Krahets - 力扣(LeetCode) (leetcode-cn.com)

以上是关于55. 跳跃游戏的主要内容,如果未能解决你的问题,请参考以下文章

算法动态规划 ⑦ ( LeetCode 55. 跳跃游戏 | 算法分析 | 代码示例 )

java刷题--55跳跃游戏

LeetCode 55. 跳跃游戏

LeetCode #55 跳跃游戏

leetcode55跳跃游戏

Leetcode55. 跳跃游戏(JAVA贪心)