LeetCode子集 回溯与递归

78. 子集

给你一个整数数组 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

小结:

  较为简单的遍历所有情况问题。只需要灵活运用递归+回溯的老方法就可以得到想要的结果了~

posted @   JunanP  阅读(2)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· 我与微信审核的“相爱相杀”看个人小程序副业
· DeepSeek “源神”启动!「GitHub 热点速览」
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
点击右上角即可分享
微信分享提示