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
发布了43 篇原创文章 · 获赞 14 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_41545780/article/details/105320284
今日推荐