leetcode NO.78 子集 白痴讲解 腾讯精选练习50

在这里插入图片描述
回溯法

class Solution:
    def subsets(self, nums: List[int]) -> List[List[int]]:
        result = []
        def dfs(lst,nums,pos):#pos用于记录轮到那一位的下一位的下标
            result.append(lst[:])#这一步不知道为什么一定要加:,但是不加:会全是[]
            for i in range(pos,len(nums)):#只用append pos后的数
                lst.append(nums[i])#递归里最重要的操作
                dfs(lst,nums,i+1)#轮到下一位
                lst.pop()#返回树的上一层
        dfs([],nums,0)
        return result

在这里插入图片描述
递归
按照之前关于递归的数学归纳法理解法
我们先当这个函数已经做好了,能求一个list的子集
给出n = 0时的解

if not nums: return [[]]

给出n = k时如何推到n = k + 1
n个数字的子集就等价于求n-1个数字的子集加上这些个子集添加上去掉的那个元素
比如说[1,2,3]的子集
我们把1拿出来,就是求[2,3]的子集,[],[2],[3],[2,3],这些子集再添上1,
[1],[1,2],[1,3],[1,2,3],全部集合就是[1,2,3]的子集

res = []#用来装答案
for p in self.subsets(nums[1:]):
            res.append(p) 
            res.append(nums[:1]+p) 
class Solution:
    def subsets(self, nums: List[int]) -> List[List[int]]:
        if not nums: return [[]]
        res=[] 
        for p in self.subsets(nums[1:]):
            res.append(p) 
            res.append(nums[:1]+p) 
        return res
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值