文章目录
- 一、题目描述
- 示例 1
- 示例 2
- 二、代码
- 三、解题思路
一、题目描述
给你一个非负整数数组 nums
,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
你的目标是使用最少的跳跃次数到达数组的最后一个位置。
假设你总是可以到达数组的最后一个位置。
示例 1
输入: nums = [2,3,1,1,4]
输出: 2
解释: 跳到最后一个位置的最小跳跃数是 2。
从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。
示例 2
输入: nums = [2,3,0,1,4]
输出: 2
提示:
1 <= nums.length <= 104
0 <= nums[i] <= 1000
`
二、代码
代码如下:
class Solution:
def jump(self, nums: List[int]) -> int:
def toJump(start,count,a):
if start+1+a[start] >= len(a):
count[0] = count[0] + 1
print("count:",count)
else:
b = a[start + 1 : start+1+a[start]].copy()
max_lengtg_index = 0
for i in range(len(b)):
if max_lengtg_index <= a[start+1+i] + start+1+i:
max_lengtg_index = a[start+1+i] + start+1+i
max_index = start+1+i
count[0] = count[0] + 1
start = max_index
b.clear()
toJump(start,count,a)
count = [0]
toJump(0,count,nums)
if len(nums) == 1 :
return 0
else:
return count[0]
三、解题思路
本题的题意是从一个数组第一个元素开始,判断最少走多少步能到达数组末尾,而走步的长度限制为当前位置数组的值:
例如 :nums = [9,8,2,2,0,2,2,0,4,1,5,7,9,6,6,0,6,5,0,5]
数组,从下标 0
开始向数组末尾移动,此时的位置为0
,对应走步的长度限制在nums[0] = 9
范围内,意思是下一个落脚点可能为[9,8,2,2,0,2,2,0,4,1,5,7,9,6,6,0,6,5,0,5] 这9个数中的其中一个。我们要做的就是不断选择一个“落脚点”使走步次数尽可能少的走到终点。
本题思路是每次都计算当前位置的下一个落脚点离终点最近的位置,以上面数组为例[9,8,2,2,0,2,2,0,4,1,5,7,9,6,6,0,6,5,0,5] ,当前的落脚点可能为8,2,2,0,2,2,0,4,1这9个点,依次计算——如果选择该落脚点后可达到的最长下标是多少,然后选择结果最大的作为下一个落脚点。
例如:
计算第一个8这个数作为落脚点时的最长下标,那么他能达到的最远距离下标为:当前对应的下标 + 当前值 = 1 + 8 = 9(index + nums[index])
但得出的结果并不是最大的,在我们遍历完这9个点后,发现最大的值是选择4这个点:8 + 4 = 12
所以此时我们选择当前4这个点的下标(index = 8)作为下一个落脚点,count值加1(count用于记录走了多少步),然后再次调用方法循环,直到计算距离大于等于nums的长度,此时输出count即可。