不明白为什么这个题难度是 “困难”
题目的意思是,给定一个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