LeetCode子集 回溯与递归
给你一个整数数组 nums
,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。
解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。
示例 1:
输入:nums = [1,2,3]
输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]
示例 2:
输入:nums = [0]
输出:[[],[0]]
思路:
这个题虽然不是全排列,但像这种要遍历所有情况的问题,就是用递归+回溯那一套!之前的题目中这个套路用了太多遍了,简单来说,定义递归函数di(has,choose),has表示当前已有,choose表示选择列表。一旦has没有出现在res当中,它就是新的子集,放入结果列表res中,并且对它进行其他扩展;如果has已经出现在res当中,则可以直接忽略了,也不需再重复地扩展,因为之前必然已经扩展过了。
还有一些细节上需要注意的点:因为要放的是集合,所以要有个排序判重复的操作,以免同时放了[1,3]和[3,1]这个重复子集;对于选择列表,也是在选择时判断是否自己已经有,避免出现[1,3,1]这个无效子集。
代码:
class Solution(object):
def subsets(self, nums):
res=[]#存放结果的列表
def di(has,choose):#递归函数
if sorted(has) not in res:#之前未存在,保存到结果并去扩展
res.append(sorted(has))#保存到结果
for c in choose:#从选择列表中选择,扩展
if c not in has:#如果当前状态没有这个选择
has.append(c)#添加进has
di(has,choose)#送入递归
has.pop(-1)#has返回原状态,方便进行其他选择(回溯的精髓!)
#这里省略了else,直接就是pass 不处理
#因为假如已经存在了,那再探索也是多余,会超时
di([],nums)#原状态has为空[],choose选择就是nums
return res
小结:
较为简单的遍历所有情况问题。只需要灵活运用递归+回溯的老方法就可以得到想要的结果了~
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· 我与微信审核的“相爱相杀”看个人小程序副业
· DeepSeek “源神”启动!「GitHub 热点速览」
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库