Jump Game

题目详情:https://leetcode.com/problems/jump-game/description/

什么情况下才能到达最后一个位置呢?如果没有0的话,那么可能能够到达最后的,比如
一步一步的走。但是如果有0的话,就需要考虑如何跨过该0元素,所以题目就变成了检查数组
中的所有的0元素是否都能跨过去

# -*- coding:utf-8 -*-
class Solution(object):
    def canJump(self, nums):
        """
        :type nums: List[int]
        :rtype: bool
        """
        length=len(nums)
        if 0 not in nums:#如果nums中没有0元素
            return True#那么可能能够到达最后的位置
        if nums[0]==0 and length>1:#如果第一个数为0的话那么无法到达最后,万一只有一个元素呢?
            return False
        elif nums[0]==0 and length==1:#只有一个元素0
            return True
        #以下的代码用以处理有0的情况
        i=0
        while i<length-1:#如果i>=length-1说明可以到达最后一个位置
            if nums[i]!=0:#如果nums[i]不等于0
                i=i+nums[i]#将i赋值为位置i能达到的最远距离
            else:#如果nums[i]==0
                j=i-1#
                while j>=0 and j+nums[j]<=i:#找到能跨过位置i的位置
                    j=j-1
                if j==-1:#j==-1代表没有找到能跨过位置i的元素
                    return False
                i=j
        return True#执行到这里,说明能够到达最后一个元素

一开始脑子就想到用递归暴力破解,列举所有的可能性,但是运行时间超时了,代码如下所示,思前想后也没有想到能够减少递归的办法。欢迎大神指点!

# -*- coding:utf-8 -*-
class Solution(object):
    def canJump(self, nums):
        """
        :type nums: List[int]
        :rtype: bool
        """
        return self.canReachLast(0,nums)
    def canReachLast(self,index,nums):
        if index>=len(nums)-1:#如果大于等于最后一个元素的位置
            return True#
        i=nums[index]#从最大的开始
        while i>0:
            if self.canReachLast(index+i,nums)==True:#如果能够到达最后的话
                return True
            i=i-1
        return False#循环结束后,执行到此说明不能到达最后

今天看见大神写的代码,模仿着写了一下

# -*- coding:utf-8 -*-
class Solution(object):
    def canJump(self, nums):
        """
        :type nums: List[int]
        :rtype: bool
        """
        maxDistance=0#maxDistance存储为最远能够到达的位置
        length=len(nums)
        for i in range(length):
            if i>maxDistance or i>=length-1:#如果i>=length-1代表着一定能够到达最后一个位置
                break#如果i>maxDistance,最远距离maxDistance到达不了i所在的位置,即无法跨过maxDistance所在的位置
            maxDistance=max(maxDistance,i+nums[i])#保存最远能够到达的距离
        return maxDistance>=length-1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值