Leetcode刷题记录——45. 跳跃游戏 II

在这里插入图片描述

不明白为什么这个题难度是 “困难”

题目的意思是,给定一个list,从[0]位置出发,每次最多可以跳nums[0]这么远
选择一种策略达到队尾且跳跃次数最少(给定条件是一定能达到队尾)

我们的策略:
我们先对输入数组中的每个元素nums[i]加上i,这样得到一个新的数组,其意义为从每个位置起飞,最远能达到的位置
记住,从此以后nums的含义发生变化,不再是输入数组了
我们从nums[0]出发,定义计数器
每次先看能否直接从nums[i]跳到队尾,若可以,直接返回sum + 1
若不行,我们再看我们能跳到的最远范围之内的各个数字,哪个最大?
(这是因为,我们要考虑花最少次数跳到最后,那么每次我们就应该选择跳跃后越接近队尾的中间跳板)
这里有个特殊情况,假设存在多个相等的最大值,我们取最靠后的最大值为跳板即可
然后我们跳到这个跳板,开始下一次跳跃

class Solution:
    def jump(self, nums: List[int]) -> int:
        suma = 0
        length = len(nums)
        nums = [i + value for i,value in enumerate(nums)]
        print(nums)
        this = 0
        while this < length - 1:
            tempmax = 0
            tempindex = 0
            end = min(length,nums[this] + 1)
            if nums[this] >= length - 1:
                return suma + 1
            #自身不能达到队尾,找最大的那个,若包含若干个最大找最后的那个
            for i in range(this,end):
                #看有无跳板能直接跳到队尾的
                if nums[i] >= length - 1:
                    return suma + 2  
                #若无上述跳板,找最大 最后                                                                                                                       
                if nums[i] >= tempmax:
                    tempmax = nums[i] 
                    tempindex = i 
            this = tempindex
            print(this,nums[this])
            suma += 1
            if tempmax >= length-1:
               return suma + 1
        return suma
发布了43 篇原创文章 · 获赞 14 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_41545780/article/details/105363311