55.跳跃游戏 python

题目

题目描述

给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。

判断你是否能够到达最后一个下标,如果可以,返回 true ;否则,返回 false 。

示例 1:

输入:nums = [2,3,1,1,4]
输出:true
解释:可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。

示例 2:

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

提示:

1 <= nums.length <= 10^4
0 <= nums[i] <= 10^5

题解

解题思路

这个问题可以通过贪心算法来解决。核心思想是跟踪我们能够到达的最远位置,并随着遍历数组不断更新这个最远位置。如果在遍历过程中,当前索引超过了能够到达的最远位置,则说明无法到达最后;如果最远位置达到了或超过了数组的最后一个下标,则可以提前返回 true

python实现

下面是 Python 实现代码:

def canJump(nums):
    # 最远可以到达的位置
    max_reach = 0
    target = len(nums) - 1

    for i, num in enumerate(nums):
        # 如果当前位置已经超出了最大可达范围,那么就无法继续前进了
        if i > max_reach:
            return False
        # 更新最远可达位置
        max_reach = max(max_reach, i + num)
        # 提前结束条件:如果最远可达位置已经可以覆盖到目标位置
        if max_reach >= target:
            return True

    # 如果循环结束后还没有返回,根据题意这里应该不会发生,但为了完整性还是加上
    return max_reach >= target

代码解释

  • 初始化:定义 max_reach 来记录能到达的最大索引位置,初始值为 0。同时定义 target 为最后一个元素的索引。

  • 遍历数组:对于每个元素 nums[i],它表示从索引 i 出发最多能向前跳 nums[i] 步。因此,i + nums[i] 是从当前位置所能达到的最远位置。

  • 更新最远可达位置:每当访问一个新的索引 i 时,检查是否可以在该点更新 max_reach。即 max_reach = max(max_reach, i + nums[i])

  • 判断是否可继续前进:如果在某次迭代中,索引 i 已经大于了 max_reach,这意味着我们被困住了,无法继续前进,直接返回 false

  • 提前退出:如果在任何时刻 max_reach 达到了或超过了 target(即最后一个元素的索引),则可以直接返回 true,因为我们已经知道可以到达终点。

这种贪心算法的时间复杂度是 O(n),其中 n 是数组 nums 的长度。这是因为我们只需要遍历一次数组即可完成所有必要的计算。空间复杂度是 O(1),因为我们只使用了常数级别的额外空间。

提交结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gxls2024

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值