这篇文章是寻找数组的所有子集的集合,例如nums=[1,2],子集集合为[[],[1],[2],[1,2]]。这个题目来自于leetcode78. Subsets。
一,动态规划思想:
- 状态:前面i个数的子集集合res1
- 状态转移方程:前面i+1个数的子集集合res2 = 前面i个数的子集集合res1 + res1所有项添加第i+1个数的集合cur
代码:
res = [[]]
for num in nums :
for temp in res[:] :
x = temp[:]
x.append(num)
res.append(x)
return res
简写:
res = [[]]
for num in nums:
res += [item+[num] for item in res]
return res
二、位操作:对于数组[1,2,3],可以用一个下标0和1表示是否选择该数字,0表示未选择,1表示选中,那么每一组3个0和1的组合表示一种选择,3位共有8种选择。
res = []
for i in range(1<<len(nums)):# 子集总共有多少个集合
tmp = []
for j in range(len(nums)):# 当前子集集合的生成
if i & 1 << j: # 当前子集集合包含第j字符的判断
tmp.append(nums[j])
res.append(tmp)
return res