
这个题关键点就在于,每个数字对于子集来说,要么在要么不在,所以很自然能想到递归。对于每个数字,选择它这条路或者不选它这条路都是我们要搜索的路径,因此,可以考虑使用回溯。
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
本文介绍两种生成所有可能子集的方法:回溯法和递归法。通过递归地选择或跳过元素,最终生成目标集合的所有子集。

被折叠的 条评论
为什么被折叠?



