作者:mo-lan-4
链接:https://leetcode-cn.com/problems/jump-game/solution/pythonji-bai-97kan-bu-dong-ni-chui-wo-by-mo-lan-4/
来源:力扣(LeetCode)
思路:尽可能到达最远位置(贪心)。
如果能到达某个位置,那一定能到达它前面的所有位置。
方法:初始化最远位置为 0,然后遍历数组,如果当前位置能到达,并且当前位置+跳数>最远位置,就更新最远位置。最后比较最远位置和数组长度。
复杂度:时间复杂度 O(n)O(n),空间复杂度 O(1)O(1)。
def canJump(self,nums):
max_i = 0 #初始化当前能到达最远的位置
for i, jump in enumerate(nums): #i为当前位置,jump是当前位置的跳数
if max_i>=i and i+jump>max_i: #如果当前位置能到达,并且当前位置+跳数>最远位置
max_i = i+jump #更新最远能到达位置
# 提前结束
if max_i< i:
return False
return max_i>=i`
方法二:
若能到达最后,那么必然存在一个最靠近终点的值能直达终点(即nums[i]>=k-i),再把最靠近终点的值看为终点(k=i)。点到这儿应该欧克了。
def canJump(self, nums: List[int]) -> bool:
n = len(nums)
k = n-1
for i in range(n-2,-1,-1):
if nums[i]>=k-i:
k=i
return k==0`
作者:dan-zhi-zhu-yan-gai
链接:https://leetcode-cn.com/problems/jump-game/solution/pythonji-bai-99ji-jian-codeni-tui-fa-by-ugnl5/
来源:力扣(LeetCode)