数组的子集集合

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014248127/article/details/79237616

这篇文章是寻找数组的所有子集的集合,例如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

猜你喜欢

转载自blog.csdn.net/u014248127/article/details/79237616