45. 跳跃游戏 II
https://leetcode-cn.com/problems/jump-game-ii/
解法一:穷举
but超时
class Solution:
def jump(self, nums: List[int]) -> int:
n = len(nums)
self.jumps = [] #记录所有的跳跃次数
self.func(nums, 0, 0)
return min(self.jumps)
def func(self, nums, pos, count): #pos为跳跃位置,count为计数
if pos >= len(nums) - 1:
self.jumps.append(count)
else:
for i in range(nums[pos], 0, -1):
self.func(nums, pos+i, count+1)
解法二:贪心
i从0开始遍历,每次前移一位,直到n-2即可。
用两个指针迭代,end指向当前能到达的距离,另一个指针farthest向前探测[i,end]
所能到达的最远距离。(若不用end保证能到达的距离,则可能出现跳步,然而本题是不能跳的,每一处都必须能到达)
当i到达end时,表示走完一步,jumps加1,end更新为farthest。
在i==0时,jumps就为1(为何?)出发就开始累计步数,因为终点可能大于数组长度,不一定能到达,所以不应该在终点才算一步,而在起点
class Solution:
def jump(self, nums: List[int]) -> int:
jumps = 0 #步数
end = 0 #当前能到达的距离
farthest = 0 #向前探测[i,end]所能到达的最远距离
for i in range(len(nums)-1):
farthest = max(i+nums[i], farthest) #更新最远距离
if i == end: #走了一步
end = farthest #更新能到达的距离
jumps += 1
return jumps
最后更新于