题目
题目描述
给你一个非负整数数组 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),因为我们只使用了常数级别的额外空间。