leetcode 45 跳跃游戏2

贪心的方法,从后往前找到哪些值可以跳到终点,取离终点最远的点,然后在接着找哪些点可以到这个点,那个点离这个点最远。注意从一个点到另一个点是算一步。
通过一步一步的局部最优,达到全局最优。

        end=len(nums)
        count=0

        while end!=1:  

            for i in range(end):

                if nums[i]+i>=end-1:
                    print(end-1-i)
                    count+=1
                    end=i+1
                    break


        return count 

通过递归方法,模拟选择的过程,然后通过递归回来将每一步加在count上面,同时比较得出最小值。
这里因为超时,需要记忆化递归

class Solution:
    def jump(self, nums: List[int]) -> int:


        memo={}

        def dfs(i):
            if i==len(nums)-1:
                return 0
            if i>len(nums)-1:
                return -1
            mini=float('inf')
            for j in range(1,nums[i]+1):

                if i+j in memo:
                    res=memo[i+j]

                else:

                    res=dfs(i+j)
                    memo[i+j]=res

                if res>=0 and res<mini:
                    mini=res+1

            return mini 

        return dfs(0)

使用lru_cache 参数填None
@functools.lru_cache(maxsize=None, typed=False)
参数是要存多少数据

使用 functools 模块的 lur_cache 装饰器,可以缓存最多 maxsize 个此函数的调用结果,从而提高程序执行的效率,特别适合于耗时的函数。参数 maxsize 为最多缓存的次数,如果为 None,则无限制,设置为 2 的幂 时,性能最佳;如果 typed=True(注意,在 functools32 中没有此参数),则不同参数类型的调用将分别缓存,例如 f(3) 和 f(3.0)。

class Solution:
    def jump(self, nums: List[int]) -> int:


        memo={}
        @functools.lru_cache(None)
        def dfs(i):
            if i==len(nums)-1:
                return 0
            if i>len(nums)-1:
                return -1
            mini=float('inf')
            for j in range(1,nums[i]+1):           

                res=dfs(i+j)


                if res>=0 and res<mini:
                    mini=res+1

            return mini 

        return dfs(0)
        count=0

正面寻找每次可以找到可以到达的最远位置的位置,通过一次for循环,当当前i遍历到最远边界的时候,次数增加一。
由于在下标为0的位置增加了一次1,所以只遍历到len(nums)-1

        count=0
        maxpos=0
        end=0

        for i in range(len(nums)-1):
            maxpos=max(maxpos,nums[i]+i)
            if i==end:
                count+=1
                end=maxpos
        return count
全部评论

相关推荐

去B座二楼砸水泥地:不过也可以理解,这种应该没参加过秋招
点赞 评论 收藏
分享
10-17 12:16
同济大学 Java
7182oat:快快放弃了然后发给我,然后让我也泡他七天最后再拒掉,狠狠羞辱他一把😋
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务