45:跳跃游戏II
程序员文章站
2022-03-17 20:51:23
...
问题描述
给定一个非负整数数组,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
你的目标是使用最少的跳跃次数到达数组的最后一个位置。
示例
输入: [2,3,1,1,4]
输出: 2
解释: 跳到最后一个位置的最小跳跃数是 2。
从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。
说明:
假设你总是可以到达数组的最后一个位置。
思路
这题目依旧是用贪心来做,只不过比跳跃游戏要难一点。 因为跳跃问题只要求我们解决是否可达的问题,这个要我们解决最少跳跃次数问题。
如果某一个作为 起跳点 的格子可以跳跃的距离是 3,那么表示后面 3 个格子都可以作为 起跳点。
可以对每一个能作为 起跳点 的格子都尝试跳一次,把 能跳到最远的距离 不断更新。
如果从这个 起跳点 起跳叫做第 1 次 跳跃,那么从后面 3 个格子起跳 都 可以叫做第 2 次 跳跃。
所以,当一次 跳跃 结束时,从下一个格子开始,到现在 能跳到最远的距离,都 是下一次 跳跃 的 起跳点。
- 对每一次 跳跃 用 for 循环来模拟。
- 跳完一次之后,更新下一次 起跳点 的范围。
- 在新的范围内跳,更新 能跳到最远的距离。
记录 跳跃 次数,如果跳到了终点,就得到了结果。
(方法一)
方法一的实现1:
class Solution:
def jump(self, nums):
res = 0
leftIndex = 0
rightIndex = 1
while rightIndex < len(nums):
maxPos = 0
for i in range(leftIndex,rightIndex):
maxPos = max(maxPos, i + nums[i])
leftIndex = rightIndex
rightIndex = maxPos+1
res += 1
return res
方法一的实践2
class Solution:
def jump(self, nums):
res = 0
rightIndex = 0
maxPos = 0
for i in range(len(nums)-1):
maxPos = max(maxPos, i+nums[i])
if i == rightIndex: # 把上次的跳完了,更新
rightIndex = maxPos
res += 1
return res
上一篇: 54、连续整数求和
下一篇: php怎么确保统计的数据正确