题意
给定一个非负整数数组,您最初位于数组的第一个位置。
数组中的每个元素表示您在该位置的最大跳跃长度。
你的目标是用最小跳跃次数跳到最后一个位置。
样例输入
[2,3,1,1,4]
样例输出
2
代码
class Solution:
def jump(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
pos=0
dp=[0]
for i in range(len(nums)):
if (i<=pos and i+nums[i]>pos):
while pos<i+nums[i] and pos<len(nums)-1:
pos+=1
dp.append(dp[i]+1)
if (pos==len(nums)-1):
return dp[len(nums)-1]
return dp[len(nums)-1]
解题思路
设dp[i]为到达i的最小步数,可知dp[i]=min(dp[j]+1,j<i且j+nums[j]>=i)。
易知dp[]是单调不下降的,于是便可以用O(n)的时间复杂度处理
设一个当前可跳最远点pos,对于每个i, 若i+nums[i]>pos,那么更新pos+1~i+nums[i]的dp值,并且把pos赋为i+nums[i]