思路
贪心策略: 用end来代表当前区间最后一个位置,maxp来代表可到达的最大位置,当区间遍历结束后,知道这个区间里有个下标可以跳跃至最远(即maxp)(贪心:每次都要选最远的跳) 那此时应该要更换区间范围.进行更换即代表走一步
如 [2,3,1,1,4] 刚开始区间【0】,当遍历区间结束,能到达最远距离是下标2,更换end为maxp,即到下标2。不论是从下标0到1或者2,都是需要走一步。
下标0这个位置可以跳到下标2 在区间[3,1]中,当遍历到下标2时发现 ,1下标可以跳到最远,那选择的跳跃应该是0下标到1,1到下一个位(maxp) (所说的下标均指列表nums的下标)
class Solution(object):
def jump(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
#dp方法 类似找零钱 超限
# dp =[0]*(len(nums))
# for i in range(1,len(nums)):
# j = i
# 走的步骤不可能大于n-1
# mins = len(nums)
# while j>0:
# if (j-1) +nums[j-1]>=i:
# mins=min(min,dp[j-1])
# j-=1
# dp[i]=mins+1
# return dp[-1]
if len(nums)==1:
return 0
endp = 0
maxp = 0
step = 0
for i in range(len(nums)-1):
maxp = max(maxp,i+nums[i])
if i == endp:
endp=maxp
step+=1
#遍历至n-2时,还没走到n
if endp<len(nums)-1:
step+=1
return step