数组的子集集合

这篇文章是寻找数组的所有子集的集合,例如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
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值