题目:
给定一个长度为
n
的 0 索引整数数组nums
。初始位置为nums[0]
。每个元素
nums[i]
表示从索引i
向前跳转的最大长度。换句话说,如果你在nums[i]
处,你可以跳转到任意nums[i + j]
处:
0 <= j <= nums[i]
i + j < n
返回到达
nums[n - 1]
的最小跳跃次数。生成的测试用例可以到达nums[n - 1]
。来源:力扣(LeetCode)
链接:力扣
示例:
示例 1:
输入:nums = [2,3,1,1,4]
输出:2
解释:跳到最后一个位置的最小跳跃数是2
。 从下标为 0 跳到下标为 1 的位置,跳1
步,然后跳3
步到达数组的最后一个位置。
示例 2:输入:nums = [2,3,0,1,4]
输出:2
解法:
使用贪心,设当前值为now,说明可以向后跳1~now格,在可以跳到的区域内遍历值,设为num,同时记录跳到每格的距离,设为index2,num+index2表示从当前位置跳1次可以探索到的空间,贪心条件为让此空间越大越好,因为同样是花费1次跳跃,可以探索到的空间越大就越早能到达终点。
代码:
class Solution: def jump(self, nums: List[int]) -> int: index = count = 0 while index != len(nums) - 1: now = nums[index] if index + now >= len(nums) - 1: count += 1 break current = index1 = 0 for index2, num in enumerate(nums[index + 1:index + 1 + now]): if index2 + num > current: current = index2 + num index1 = index2 index += index1 + 1 count += 1 return count