文章目录

题目描述

给你一个非负整数数组 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号位。所以此时程序结束。跳了两次。别忘了最后一次也要跳。

leetcode(力扣) 45. 跳跃游戏 II (贪心算法)_leetcode

完整代码:

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 # 更新跳跃计数