【leetcode】跳跃游戏O(n)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_36372879/article/details/88561501

在这里插入图片描述


超时思想,使用递归

使用递归之后,可以遍历所有的情况,如果有一个结果可以到达最后面,那么说明是ok的,否则返回false。但是肯定不是最佳的,会超时

class Solution:
    def RecursionJump(self, nums, loc):
        if loc == len(nums) - 1:
            return True
        if nums[loc] == 0 and loc != len(nums) - 1:
            return False
        for i in range(min(nums[loc], len(nums) - 1 - loc), 0, -1):
            if self.RecursionJump(nums, loc + i):
                return True
        return False
    def canJump(self, nums: List[int]) -> bool:
        if nums == []:
            return False
        return self.RecursionJump(nums, 0)

改进算法,O(N),遍历一遍就可以解决

从后面往前面遍历,如果前面的节点i可以达到最后一个节点,那么只需要把后面的截断,检测更前面的节点能否到达这个节点i即可。
之后看0下标节点能不能够到达i,如果能,则返回true,否则返回false
例如:[3,2,1,0,4]。可以看到,往前面遍历的时候,永远不会有节点能够到达4这个节点。

class Solution:
    def canJump(self, nums: List[int]) -> bool:
        if nums == []:
            return False
        n = len(nums) - 1
        for i in range(len(nums) - 2, -1 , -1):
            if nums[i] + i >= n:
                n = i
        return n == 0

猜你喜欢

转载自blog.csdn.net/weixin_36372879/article/details/88561501