Leetcode刷题记录——55. 跳跃游戏

在这里插入图片描述

这道题一开始没理解,转述一下题目的要求:

给定一个列表nums,我们从第0个元素开始 往后跳跃,
一开始能跳到的最远距离是nums[0],
也就是说,我们第一步可以选择跳到
{1,2,…,nums[0]}中的任一个
随后,假设我们跳到了a,我们可以继续跳
可选的跳跃范围是{a+1,…,a+nums[a]}
就这样跳,直到跳到最后,
若这样能跳到最后,我们返回true,否则返回false

整理一下思路:这可以用贪心算法解决
我们希望经过一次次的跳跃,每次都能跳到最远的地方
因此,我们先计算从每个位置出发能跳到的最远位置
因为nums中每个元素都的含义是从这里能跳到的最远距离
而从nums[i]能达到的最远位置就可以表示为 i + nums[i]
因此我们对nums的每个元素都先计算一下
nums = [i + nums[i] for i,value in enumerate(nums)]
现在nums中第i个元素的意义是,如果我们从第i个位置开始跳
我们最远能跳到的位置
我们跳跃的策略是
从nums[0]开始,每次都跳到能跳到的最远位置
如 对nums=[3,2,1,0,4],计算后nums = [3,3,3,3,8]
则 我们从第0个位置可以跳到的位置为1,2,3
我们选nums[1:4] 即nums[1],nums[2],nums[3] 中最大的
一直这样跳,直到最后
要么跳到最后的位置:True
要么困在一个位置(即所能达到的tempmax位置还没到最后 且这个数值在相邻两次跳跃后保持不变):False

class Solution:
    def canJump(self, nums: List[int]) -> bool:
        length = len(nums)
        nums = [nums[i] + i for i in range(length)]
        start = 0
        last = 0
        this = 0
        while this < length - 1:#还没到
            if start == 1 and this == last:
                return False
            elif start == 0:
                start = 1
            end = nums[this]
            if end >= length - 1:
                return True
            templist = nums[last:end+1]#last+1
            tempmax = max(templist)
            last = this
            this = tempmax 
            print(last,this)
            if this == end and this < length - 1:
                return False
        return True
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值