LeetCode-55跳跃游戏

本文最后更新于:2025年1月25日 上午

LeetCode-55跳跃游戏

题目描述

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

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

示例 1:

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

示例 2:

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

提示:

  • 1 <= nums.length <= 104
  • 0 <= nums[i] <= 105

题解

动态规划(超时)

利用数组f记录是否该位置可达,反向求解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Solution(object):
def canJump(self, nums):
"""
:type nums: List[int]
:rtype: bool
"""
n = len(nums)
if n == 1:
return True
f = [False for _ in range(n)]
f[n-1] = True
for i in range(n-2, -1, -1):
for j in range(1, nums[i]+1):
if f[i+j] == True:
f[i] = True
break
return f[0]

优化后的倒序遍历

使用需要的step代替存储的可达数组

1
2
3
4
5
6
7
8
9
10
11
12
13
class Solution(object):
def canJump(self, nums):
"""
:type nums: List[int]
:rtype: bool
"""
n = len(nums)
step = 1
for i in range(n-2, -1, -1):
if nums[i] >= step:
step = 0
step += 1
return step == 1

正向贪心

正向遍历,记录最远可达距离right

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Solution(object):
def canJump(self, nums):
"""
:type nums: List[int]
:rtype: bool
"""
n = len(nums)
right = 0
for i in range(n):
if i <= right:
right = max(right, i + nums[i]) # 更新可达的最远点
if right >= n-1:
return True
else:
break
return False

LeetCode-55跳跃游戏
https://furthur509.github.io/2025/01/18/LeetCode-55跳跃游戏/
作者
Yang Mingxin
发布于
2025年1月18日
许可协议