题很简单,怎么少点写代码比较困难。
这题很明显贪心算法,每次跳跃我们都希望理论上能到达的地方更远。一开始站在初始点,那么可选范围就是0到nums[0],在这里面找能跳得最远的点i,接下来遍历nums[0]+1到 i+nums[i],这是下一个可选范围,仍然找能跳的最远的点j。
可以发现,遍历一次就够。跳多少次怎么判断?我们需要遍历的时候保存当前可选范围和跳跃最远范围,当遍历到可选范围边界了,说明得从刚才的点里能跳的最远的地方跳一次了,此时jump+=1,可选范围更新。
由于遍历总是在可选范围里(每次要超出可选范围了,都会更新可选范围),所以如果在可选范围未到终点时,如果发现某一步能到达终点,就可以停止遍历了,直接jump+1返回
class Solution:def jump(self, nums: List[int]) -> int:jump = 0cur_right = 0 next_right = 0 for i in range(len(nums)-1):next_right = max(next_right, i+nums[i])if next_right >= len(nums)-1:return jump+1if i == cur_right:cur_right = next_right jump+= 1 return jump