子集

本文深入探讨了子集生成算法的两种实现方式,通过具体示例解析了如何为给定的整数数组生成所有可能的子集(幂集),并确保解集中不包含重复子集。代码一采用递归策略,而代码二则使用迭代方法,两者均有效解决了问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。

输入: nums = [1,2,3]
输出:
[
  [3],
  [1],
  [2],
  [1,2,3],
  [1,3],
  [2,3],
  [1,2],
  []
]
代码一:
先添加特殊的;
后遍历组合:效率低
def subsets(nums):
    if not nums:return [[]];
    leg=len(nums);
    res=[[],nums];
    if leg==1:
        return res;
    for i in nums:res.append([i]);
    
    def run(re,j,s):
        if j==0:
            res.append(re+[]);
        else:
            for i in range(s,leg):
                lp=nums[i]
                re.append(lp);
                run(re,j-1,i+1);
                re.pop();
    if leg>2:
        for i in range(2,leg):
            run([],i,0);
    return res;
代码二:

def subsets(nums):
    res=[[]];
    for i in nums[::-1]:
    	#代码段一: res可以加[:] 也可以不加
        res=res+[[i]+k for k in res[:]];
        #代码段二:
        # 对以下代码的解释: 
        #注意代码中res[:]是必须的,不然的话会反复循环
        #因为切片是引用新的对象,
		# 此时在循环中res[:]是不更新的,而res是不断有元素push进去的,很trick
        # for j in res[:]:
        #     res.append(j+[i]);
    return res;
        
nums = [1,2,3]
print(subsets(nums));

[[], [3], [2], [2, 3], [1], [1, 3], [1, 2], [1, 2, 3]]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值