文巾解题 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的主要内容,如果未能解决你的问题,请参考以下文章

leetcode-----45. 跳跃游戏 II

LeetCode刷题笔记-动态规划-day4

LeetCode刷题笔记-动态规划-day4

LeetCode 45. 跳跃游戏 II | Python

leetcode 每日一题 45. 跳跃游戏 II

leetcode 每日一题 45. 跳跃游戏 II