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 , 所以永远不可能到达最后一个下标。
贪心遍历
核心特性:如果能够到达当前位置,那么也就一定能够到达当前位置的左边所有位置
- 对每一个能作为 起跳点 的格子都尝试跳一次,把 能跳到最远的距离 不断更新
- 如果可以一直跳到最后,就成功了
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 i−1 个位置跳出的最远距离 > = i >=i >=i ,即 d p [ i − 1 ] > = i , dp[i-1]>=i , dp[i−1]>=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[i−1],i+nums[i]) ,
- 否则,表示它不能到达该位置, i i i 位置可以跳出的最远距离由前面元素决定,即 d p [ i ] = d p [ i − 1 ] dp[i]=dp[i-1] dp[i]=dp[i−1]
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
参考
以上是关于55. 跳跃游戏的主要内容,如果未能解决你的问题,请参考以下文章