Leecode Hot100 78.子集 Python

本文介绍两种生成所有可能子集的方法:回溯法和递归法。通过递归地选择或跳过元素,最终生成目标集合的所有子集。
部署运行你感兴趣的模型镜像

在这里插入图片描述
这个题关键点就在于,每个数字对于子集来说,要么在要么不在,所以很自然能想到递归。对于每个数字,选择它这条路或者不选它这条路都是我们要搜索的路径,因此,可以考虑使用回溯。

1.回溯法
class Solution(object):
    def subsets(self, nums):
        ans = []
        stack = []

        def dfs(cur):  #回溯法
            if cur == len(nums):#搜到底了,存储当前栈的结果。
            #注意这里要加一个list(),否则ans中的每一个子集共用一个地址空间,最后会全变为[]。
                ans.append(list(stack))  
                return
            stack.append(nums[cur]) #要它
            dfs(cur + 1)
            stack.pop()     #不要它
            dfs(cur + 1)

        dfs(0)
        return ans
2.附上一种质朴的递归方法
class Solution(object):
    def subsets(self, nums):
        ans = []
        stack = []
        ans.append([])

        def find_subsets(l_num, subsets):
        #    print(subsets)
            if len(l_num) == 0:
                return subsets
            first_chr = l_num[0]		#第一个字符
            new_subsets = list(subsets)  #不选择first_chr的那些子集
            for item in subsets:  #选择了first_chr的那些子集
                new_subsets.append(item + [first_chr])
            return find_subsets(l_num[1:], new_subsets)


        ans = find_subsets(nums,[[]])
        return ans

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值