回溯法
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