LeetCode跳跃游戏递归解法求助:无法实现回溯逻辑
递归实现跳跃游戏问题的修正方案
问题回顾
给定整数数组nums,初始位置为数组第一个索引,数组每个元素代表当前位置的最大跳跃长度。判断是否能到达最后一个索引,能则返回true,否则返回false。
示例1:
输入:nums = [2,3,1,1,4]
输出:True
解释:从索引0跳1步到索引1,再跳3步到最后一个索引。
示例2:
输入:nums = [3,2,1,0,4]
输出:False
解释:无论如何都会到达索引3,其最大跳跃长度为0,无法到达最后一个索引。
你的代码问题分析
你当前的递归代码存在几个关键问题:
- 多余的外层
for i in range(len(n))循环:每次递归的数组是从当前跳跃位置开始的切片,当前递归只需要处理数组的第一个位置(即当前所处的位置),不需要遍历整个数组。 - 错误的直接返回递归结果:内层循环里
return self.jumpGame(n[next:])会导致只要第一个跳跃路径失败就直接返回false,不会尝试其他可能的跳跃步数。 - 0值处理逻辑缺失:当当前位置的跳跃长度为0时,内层循环不会执行,但之前的结构会直接走到最后返回false,不过整体逻辑的错误导致回溯失效。
修正后的递归代码
def jumpGame(self, n: []) -> bool: # 已经到达或超过最后一个索引,返回True if len(n) <= 1: return True # 当前位置的最大跳跃步数 max_step = n[0] # 当前位置无法跳跃,直接返回False if max_step == 0: return False # 尝试所有可能的跳跃步数 for j in range(1, max_step + 1): # 如果该跳跃路径能到达终点,立即返回True if self.jumpGame(n[j:]): return True # 所有路径都尝试过,无法到达终点,返回False return False
代码逻辑说明
- 终止条件:当传入的数组长度小于等于1时,说明已经站在最后一个索引(或超出),直接返回
True。 - 当前位置判断:如果当前位置的最大跳跃步数为0,说明无法前进,直接返回
False。 - 尝试所有跳跃可能:遍历从1到
max_step的所有步数,对每个步数递归处理对应的子数组。只要有一个递归调用返回True,就说明这条路径可行,立即返回True。 - 回溯处理:所有跳跃步数都尝试后仍无法到达终点,返回
False,触发上层递归尝试其他路径。
测试验证
- 针对示例1:第一次递归尝试跳1步到
[3,1,1,4],在该递归中尝试跳3步到[4],触发终止条件返回True,最终整体返回True。 - 针对示例2:所有可能的跳跃路径最终都会走到包含
0的子数组,此时返回False,所有路径尝试完毕后整体返回False。
内容的提问来源于stack exchange,提问作者sotn
相关产品推荐
相关产品推荐

