leetcode(力扣) 45. 跳跃游戏 II (贪心算法)
原创
©著作权归作者所有:来自51CTO博客作者深度不学习的原创作品,请联系作者获取转载授权,否则将追究法律责任
文章目录
题目描述
给你一个非负整数数组 nums ,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
你的目标是使用最少的跳跃次数到达数组的最后一个位置。
假设你总是可以到达数组的最后一个位置。
示例 1:
输入: nums = [2,3,1,1,4]
输出: 2
解释: 跳到最后一个位置的最小跳跃数是 2。
从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。
示例 2:
输入: nums = [2,3,0,1,4]
输出: 2
思路分析
贪心,每次都找最优的那个操作。
读取当前所指的值,看看后面跳跃的范围中那个最大。选择最大的跳。
找了张图 ,帮助理解。
- 显然开始的时候在0位置,可跳跃范围是 1,2号位置。1号位的数最大,所以跳到一号位。
- 然后到了1号位,1号位为3.可以跳跃到最后一个4号位。所以此时程序结束。跳了两次。别忘了最后一次也要跳。
完整代码:
class Solution:
def jump(self, nums: List[int]) -> int:
# 如果起点就是终点
if len(nums) == 1:
return 0
# 如果一步就能跳到终点
if nums[0] >= len(nums)-1:
return 1
max_pos = 0 # 最远位置
count = 1 # 跳跃次数 (默认第一步能跳出去且未到达终点)
cur = 0 # 当前位置
while True:
# 遍历从当前位置可以跳到所有位置
for i in range(cur + 1, cur + nums[cur] + 1):
# 如果已经能跳到终点就不再继续了
if i + nums[i] >= len(nums) - 1:
return count + 1 # 出口在这里
# 选取能跳的最远的下一个位置
if i + nums[i] > max_pos:
cur = i # 更新位置
max_pos = i + nums[i] # 更新距离
count += 1 # 更新跳跃计数