LeetCode55-跳跃游戏

昨天晚上,竟然做了一个脱单的梦

现在想想还觉得有些可笑

梦境太真实了

我梦到她突然发了一条朋友圈公布恋情

里面的配图是她爸爸说的一句话

这句话里面的几个字都是拼凑在一起的

现在已经记得不太清楚了

但是这个主要情节还是历历在目

早上被闹钟闹醒了

我还躺在床上恍惚了好一会儿

并且掏出了手机翻看朋友圈看看是不是有这条朋友圈

哈哈哈哈哈

其实想想要是昨天晚上没设那个闹钟

好像也不错的样子


55-跳跃游戏

给定一个非负整数数组,你最初位于数组的第一个位置。

数组中的每个元素代表你在该位置可以跳跃的最大长度。

判断你是否能够到达最后一个位置。

示例 1:

输入: [2,3,1,1,4]
输出: true
解释: 从位置 0 到 1 跳 1 步, 然后跳 3 步到达最后一个位置。

示例 2:

输入: [3,2,1,0,4]
输出: false
解释: 无论怎样,你总会到达索引为 3 的位置。但该位置的最大跳跃长度是 0 , 所以你永远不可能到达最后一个位置。

思路:

其实本题有点借鉴了贪心算法的思想,即:每一次遍历都取前面所有遍历元素所能到达最远位置的最大值,如果该最大值大于或等于给定数组nums的长度,则说明游戏成功,反之则失败。这一题其实是要比之前的跳跃游戏II要简单许多,因为你不要求出具体的跳跃步骤,只需要给出答案即可,这一题的难点就是对于0元素的处理,因为出现了0说明这一步是不跳的,那么0出现在哪个位置就要好好考虑了。

代码如下:

class Solution:
    def canJump(self, nums):
        """
        :type nums: List[int]
        :rtype: bool
        """
        if len(nums) <= 1:
            return True
        max_num = 0
        for index in range(len(nums)-1):
            # 如果跳跃过程中出现了0元素,刚好该元素对应得下标值大于之前元素所能到达的最远值,
            # 说明该0元素位置是目前所能到达的最远位置。如果该位置的元素是0,则无法前进了,说明游戏失败
            if nums[index] == 0 and index >= max_num:
                return False
            max_num = max(max_num, index+nums[index])
            # 如果该最大值大于或等于给定数组nums的长度,则说明游戏成功
            if max_num >= len(nums)-1:
                return True
        return False


if __name__ == "__main__":
    nums = [3, 2, 1, 1, 4]
    final_result = Solution().canJump(nums)
    print(final_result)

执行效率还属中上吧,在60%左右。

LeetCode55-跳跃游戏