很多情况下需要求解一个集合中的所有子集以至于本来是个简单题,结果子集不会求导致题目解不出来!比如这一题 找出所有子集的异或总和再求和
首先介绍一下什么是子集:
对于一个列表 [1, 2, 3],从中挑选一个或多个数或者不挑数形成的新的列表就是他的子集,所以这个列表的所有子集为
空集、
1、
2、
3、
1,2、
1,3、
2,3、
1,2,3
一共8个子集
对于集合(列表)求集合的方式有两大类------双重循环法和递归法
双重循环法
其实就是枚举,但是不知道的话不容易反应过来
# 直观一点的,两层套起来
def subsets(nums):
result = [[]]
for num in nums:
for element in result[:]:
x = element[:]
x.append(num)
result.append(x)
return result
# 不直观的,直接套在里面的
def subsets_2(nums):
res = [[]]
for num in nums:
# 注意后面是 for i in res,不是num
res += [i + [num] for i in res]
return res
递归大法
需要有一个在函数外面的变量 result
实时存储结果
nums = [1,2,3]
result = []
def f(help_l, pos):
result.append(help_l[:])
for i in range(pos, len(nums)):
help_l.append(nums[i])
f(help_l, i + 1)
help_l.pop()
f([], 0) # 调用的时候help_l是空集,0表示从第一个元素开始
print(result)