# 给出一个数组,使用Python判断这个数组能不能走到底,每一步要走的步数是每个数据索引下的值
# 贪心算法
def can_jump(nums):
if not nums: # 处理空数组的情况
return False
if len(nums) == 1: # 处理只有一个元素的情况
return True
max_reach = 0 # 能到达的最远位置
# 遍历数组中的每个位置,注意这里只需要遍历到倒数第二个位置
for i in range(len(nums) - 1):
# 如果当前位置已经超过了能到达的最远位置,返回False
if i > max_reach:
return False
# 更新能到达的最远位置
max_reach = max(max_reach, i + nums[i])
# 如果已经能够到达最后一个位置,提前返回True
if max_reach >= len(nums) - 1:
return True
return max_reach >= len(nums) - 1
# 动态规划算法
def can_jump_dp(nums):
n = len(nums)
# dp[i] 表示是否能够到达位置i
dp = [False] * n
dp[0] = True # 起始位置可以到达
for i in range(n):
if dp[i]: # 如果当前位置可以到达
# 从当前位置可以跳跃的所有位置
for j in range(1, nums[i] + 1):
if i + j < n:
dp[i + j] = True
if i + j >= n - 1: # 如果能够到达或超过最后一个位置
return True
return dp[n - 1] # 返回是否能到达最后一个位置
# 测试用例
test_cases = [
[2, 3, 1, 1, 4], # True - 可以跳 2 步到位置 2,然后跳 1 步到位置 3,最后跳 1 步到位置 4
[3, 2, 1, 0, 4], # False - 无法跳过位置 3 的 0
[1, 1, 1, 0], # True - 可以一步一步跳到最后
[0], # True - 已经在终点
[1, 0], # True - 可以跳一步到达终点
[0, 1], # False - 第一个位置是 0,无法继续
]
for nums in test_cases:
result = can_jump(nums)
print(f"数组 {nums} {'可以' if result else '不可以'}到达最后一个位置")