使用DFS生成固定长度和为指定数的列表时,局部结果无法存入全局列表
问题分析与解决方案
我一眼就看出问题出在哪了——你在往res里添加的是列表temp的引用,而不是一个独立的副本!
为什么会出现“打印有内容,返回为空”的情况?
当你执行res.append(temp)时,并没有把当前temp里的元素复制一份存到res里,而是把temp这个列表对象的“地址”存了进去。后续你调用temp.pop()的时候,会直接修改这个地址指向的列表内容。虽然在print(res, y)的时候,temp还没被pop,所以能看到有值,但等整个DFS递归结束后,temp被清空了,res里所有的元素其实都是指向同一个空列表的引用,自然返回的时候就全是空的了。
怎么修复?
只需要在添加到res的时候,创建一个temp的副本就行,常见的两种写法:
res.append(temp.copy())res.append(list(temp))
修改后的代码如下:
class Solution: def connect(self , m , n ): res = [] def helper(x, y, temp): # 去掉res参数,直接用外层的res更简洁 if len(temp) == y: temp.sort() res.append(temp.copy()) # 关键:添加副本而非引用 return if x >= 0: for i in range(0, x+1): temp.append(i) helper(x - i, y, temp) temp.pop() temp = [] helper(m, n, temp) return res # 测试验证 print(Solution().connect(5, 3))
额外优化建议
- 去掉
helper函数里的res参数:外层函数已经定义了res,可以直接访问,减少参数传递的冗余。 - 提前控制元素顺序:如果不想在每次递归里排序,也可以在递归选择元素时就按非降序取值(比如
range(i, x+1)),这样既能避免重复排序,还能自动过滤掉重复的无序组合。
现在运行修改后的代码,返回的res就会是你预期的所有和为5、长度为3的有序列表了。
内容的提问来源于stack exchange,提问作者qin wang
相关产品推荐
相关产品推荐

