https://leetcode.com/problems/jump-game-ii/description/
给定一个非负整数数组,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
你的目标是使用最少的跳跃次数到达数组的最后一个位置。
思路1:递归穷举,但是会超时
class Solution:
def jump(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
n = len(nums)
jumps = [] #记录所有的跳跃次数
self.func(nums, 0, 0, jumps)
return min(jumps)
def func(self, nums, pos, count, jumps): #pos为跳跃位置,count为计数
if pos >= len(nums) - 1:
jumps.append(count)
else:
for i in range(nums[pos], 0, -1):
self.func(nums, pos + i, count + 1, jumps)
思路2:贪心法。i从0开始遍历,每次前移一步,直到n-2即可。用两个指针迭代,end指向当前能到达的最远距离,另一个指针farthest向前探测[i,end]所能到达的最远距离。当i到达end时,表示走完一步,jumps加1,end更新为farthest。
class Solution:
def jump(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
jumps, end, farthest = 0, 0, 0
for i in range(len(nums)-1):
farthest = max(i + nums[i], farthest)
if i == end:
end = farthest
jumps += 1
return jumps