题目:给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个位置。
示例 1:
输入: [2,3,1,1,4]
输出: true
解释: 我们可以先跳 1 步,从位置 0 到达 位置 1, 然后再从位置 1 跳 3 步到达最后一个位置。
解答:
该题共有两种解法。
1、贪心算法,在每个位置i首先确定能否到达该位置,而后针对位置i判断它之后更新最远能够跳到哪个点maxright,判断maxright是否大于最末端的位置,从而输出结果。
// An highlighted block
def canJump(self, nums: List[int]) -> bool:
maxright, n = 0, len(nums)
for i in range(n):
#如果上一个maxright能够到这i这个点,之后更新maxright,而后判断是否可以到达最后一步
if maxright >= i:
maxright =max(maxright, i + nums[i])
if maxright >= n-1:
return True
return False
2、动态规划算法,维护一个dp[n]数组,针对每一个位置是否能够达到,由前面的几个位置j是否能够达到以及前面的点是否可以达到当前点i进行i的状态更新。最后返回dp[-1]。需要注意的是,j遍历的过程中,建议从最靠近i的点开始,减小工作量。从0-i的话,会超时。
# An highlighted block
def canJump(self, nums: List[int]) -> bool:
dp = [False]*len(nums)
dp[0]=True
for i in range(1, len(nums)):
for j in range(i-1, -1,-1):
if dp[j]==True and j+nums[j]>=i:
dp[i]=True
break
return dp[-1]
给定一个非负整数数组,每步可以跳跃的最大长度,判断能否到达最后一个位置。文章介绍了两种解法:贪心算法和动态规划,详细解释了每种方法的思路和实现过程。

715

被折叠的 条评论
为什么被折叠?



