45. 跳跃游戏 II
一、题目
给定一个长度为 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]
。
二、思路
如果我们「贪心」地进行正向查找,每次找到可到达的最远位置,就可以在线性时间内得到最少的跳跃次数。
三、代码
class Solution: def jump(self, nums: List[int]) -> int: n = len(nums) maxPos, end, step = 0, 0, 0 for i in range(n - 1): if maxPos >= i: maxPos = max(maxPos, i + nums[i]) if i == end: end = maxPos step += 1 return step
四、分析
复杂度分析
-
时间复杂度:O(n),其中 nnn 是数组长度。
-
空间复杂度:O(1)。