文巾解题 45. 跳跃游戏 II
Posted UQI-LIUWJ
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了文巾解题 45. 跳跃游戏 II相关的知识,希望对你有一定的参考价值。
1 题目描述
2 解题思路
2.1 记录每个点可达的步数
使用一个reach数组,reach[i]记录到达坐标i的时候,需要几跳。
对于每个点i,更新它向后nums[i]个点的reach值
一旦更新过了reach[len(nums)-1],也就是最后一个点的reach,那么返回。因为后面再更新这个reach,需要的跳数会更多
class Solution:
def jump(self, nums: List[int]) -> int:
reach=[0]
l=len(nums)
if(l==1):
return(0)
for i in range(l-1):
reach.append(l+2)
for i in range(l):
for j in range(i+1,min(i+1+nums[i],l)):
reach[j]=min(reach[j],reach[i]+1)
if(i+1+nums[i]>=l):
break
return(reach[-1])
时间复杂度 O(n^2) 【遍历每个点需要O(n),每个点又要更新它可达的点的reach,又需要O(n)】
2.2 贪心
我们每次在可跳范围内选择可以使得跳的更远的位置。
如下图,开始的位置是 2,可跳的范围是橙色的。然后因为 3 可以跳的更远,所以跳到 3 的位置。
end=2,表示本轮最远可以遍历到下标2这个位置
max_pos=4,表示本轮遍历的这些点,可以跳到的最远的位置是4(也就是下一轮可以遍历的最远的位置)
step=1,表示到达本轮这些点,需要的跳数
如下图,然后现在的位置就是 3 了,能跳的范围是橙色的,然后因为 4 可以跳的更远,所以下次跳到 4 的位置。
end=4,表示本轮最远可以遍历到下标4这个位置
max_pos=8,表示本轮遍历的这些点,可以跳到的最远的位置是8(也就是下一轮可以遍历的最远的位置,当然比最后一个点还要远,所以就相当于到达最后一个点了)
step=2,表示到达本轮这些点,需要的跳数
class Solution:
def jump(self, nums: List[int]) -> int:
end=0 #当前能够跳的边界(上一轮算出来的,上一轮可以跳到的最远的点)
max_pos=0 #这一轮可以跳到的最远的点,作为下一轮可以考虑的点的最远边界
step=0# 到达当前遍历的点,需要几跳
for i in range(len(nums)-1):
#循环不用考虑最后一个点,首先是最后一个点肯定可达;其次是如果正好上一轮的end是最后一个点,那么遍历到最后一个点的时候,step还需要+1,那么结果就不对了
max_pos=max(max_pos,i+nums[i])
#这一轮可以到达的这些点中,可以跳到的最远的点
if(i==end):
#如果到达了这一轮可以到达的最远的点(此时已经考虑完本轮遍历的点可以跳到的最远的点了)
end=max_pos
#将这一轮可以跳到的最远的点赋值给下一轮的边界(下一轮可以遍历的u资源的点)
step+=1
#之后的点,到达他们需要的跳数+1
return(step)
时间复杂度O(n)
以上是关于文巾解题 45. 跳跃游戏 II的主要内容,如果未能解决你的问题,请参考以下文章