【力扣】跳跃游戏

作者: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)

上一篇:支配树


下一篇:poj-3258 River Hopscotch