LeetCode《Check if There is a Valid Partition For The Array》递归终止求助
修正LeetCode《Check if There is a Valid Partition For The Array》递归解法的终止问题
你的代码核心问题出在递归参数设计混乱和递归逻辑错误,导致空列表的终止条件无法被正确触发,同时递归路径的判断逻辑完全错误。以下是问题分析和修正方案:
原代码的核心问题
- 参数冗余且逻辑混乱:同时传递
nums(子数组)和s(原数组),加上k的错误使用,导致递归时无法正确跟踪处理进度,空列表的终止条件几乎不会被触发。 - 递归逻辑错误:用两个递归结果相加后直接返回
False,完全忽略了递归返回的有效路径判断,即便存在正确分区也会返回错误结果。 - 终止条件设计不合理:通过传递空数组作为终止信号,不如直接用索引跟踪处理位置,当索引到达数组末尾时即代表分区成功。
修正后的代码
class Solution: def validPartition(self, nums: list[int]) -> bool: memo = {} n = len(nums) def partition_helper(i): # 处理到数组末尾,说明所有元素已成功分区 if i == n: return True # 已缓存的结果直接返回,避免重复计算 if i in memo: return memo[i] valid = False # 情况1:取两个相等的元素 if i + 1 < n and nums[i] == nums[i+1]: valid = valid or partition_helper(i + 2) # 情况2:取三个元素,满足全相等或连续递增1 if i + 2 < n: is_triple_equal = nums[i] == nums[i+1] == nums[i+2] is_consecutive = nums[i+1] - nums[i] == 1 and nums[i+2] - nums[i+1] == 1 if is_triple_equal or is_consecutive: valid = valid or partition_helper(i + 3) memo[i] = valid return valid return partition_helper(0)
关键修改点说明
- 用索引替代子数组传递:递归参数
i代表当前处理到数组的第i个元素,当i == len(nums)时,说明所有元素都已完成有效分区,直接返回True(这就是你想要的“空列表”终止逻辑的正确实现)。 - 优化缓存逻辑:memo缓存的是索引
i对应的结果,相比缓存整个子数组的tuple,效率更高且逻辑清晰。 - 正确判断合法分区:
- 当剩余元素≥2时,判断前两个元素是否相等,若相等则递归处理
i+2的位置。 - 当剩余元素≥3时,判断三个元素是否全相等或连续递增1,若满足则递归处理
i+3的位置。
- 当剩余元素≥2时,判断前两个元素是否相等,若相等则递归处理
- 逻辑判断修正:用
valid = valid or ...来判断是否存在至少一条有效分区路径,只要其中一个递归返回True,当前结果即为True。
测试你的示例nums=[4,4,4,5,6,6,6,6],修正后的代码会正确返回True,可行的分区方式比如:[4,4](索引0-1)→ [4,5,6](索引2-4)→ [6,6,6](索引5-7),完全符合题目要求。
内容的提问来源于stack exchange,提问作者Puzzleshock
相关产品推荐
相关产品推荐

