leetcode55,45

class Solution:
    def canJump(self, nums: List[int]) -> bool:
        if len(nums)==1:#只有一个是可以到达的。
            return True
        cover=0
        i=0
        while i<=cover:#因为cover是动态变化的,for不支持,所以改用while
            cover=max(i+nums[i],cover)
            if cover>=len(nums)-1:
                return True
            i+=1
        return False
    '''这道题的贪心算法精髓在于,我们不需要知道每次到底走几步,我们只需要知道,最终我们的覆盖范围
    到底能不能覆盖到最后一位。每次的覆盖范围为cover,那么在cover范围内,我们有不同的选择,分别继续往后走。
    那么能到达的最远位置是i+nums[i]与原cover取max,如此循环操作后,如果我们能覆盖到最后一个数的索引len-1,
    那么就说明我们可以走到当把所有可能性遍历完毕,仍然没有合适的,就说明不存在。'''


class Solution:
    def jump(self, nums: List[int]) -> int:
        if len(nums)==1:
            return 0
        curcover=0#当前能到达的最远位置
        nextcover=0#下一步能到达的最远位置
        step=0#记录步数
        for i in range(len(nums)):
            nextcover = max(i + nums[i], nextcover)#在当前能到达的位置内,选择下一步能到达的最远位置。
            if i==curcover:#表示已经到达当前能到达的最远位置。
                if curcover<len(nums)-1:#如果当前能到达的最远位置并没有到达最后,就要走下一步,步数+1
                    step+=1
                    curcover=nextcover#让下一步变为当前步
                    if nextcover>=len(nums)-1:#如果当下一步的最远位置已经比最后一个点要大,退出。
                        break#为什么会退出呢,因为下一轮循环的时候cur=next>=len-1,step不会+1了。所以是正好的。
        return step





class Solution:
    def jump(self, nums: List[int]) -> int:
        if len(nums)==1:
            return 0
        curcover=0
        cnt=0
        nextcover=0
        i=0
        while i<=len(nums)-2:
            nextcover=max(i+nums[i],nextcover)
            if i==curcover:
                cnt+=1
                curcover=nextcover
            i+=1
        return cnt

第二种方法把讨论情况都放在一起。因为无论如何都会到达,所以只需要cover能到达len(nums)-2的位置就可以了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值