每次贪心的选择 从当前步能到达的范围内,下一次能跳到的最远距离
所以end当前步所能到达的范围结束,i到达end就要计算下一步。
def jump(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
#每次贪心的选择 从当前步能到达的范围内,下一次能跳到的最远距离
#所以end当前步所能到达的范围结束,i到达end就要计算下一步。
end = 0
max_pos = 0
res = 0
for i in range(len(nums)-1):
max_pos = max(nums[i]+i,max_pos) #当前能到达的区域内,跳一步能跳出的最远范围
if i == end: #上一步到达最远范围了
res += 1 #选择能到达的最远范围的那步跳
end = max_pos #跳
return res
dp定义为跳到节点i所需的最小步数
由于对于后面的节点,想要到达所需的最小步数肯定大于等于前面的节点
所以最早能到达i节点的j就是最小的dp[i],j不用遍历了
而且前面的j到不了i就更到不了i+1了,所以j不用重置为0而是从当前步开始就行
def jump(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
n = len(nums)
dp = [n]*n
dp[0] = 0
j = 0
for i in range(1,n):
while j + nums[j] < i:
j += 1
dp[i] = dp[j]+1
return dp[n-1]
def jump(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
#dp定义为从某个节点跳到终点所需的最小步数
n = len(nums)
dp = [n]*n
dp[0] = 0
for i in range(1,n):
for j in range(i):
if j + nums[j] >= i:
dp[i] = min(dp[i],dp[j]+1)
return dp[n-1]