LeetCode 78. Subsets--Python实现

本文详细介绍了生成一组不重复整数的所有可能子集(幂集)的三种方法:动态规划法、中间变量法及回溯法,并提供了每种方法的具体实现代码。

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

Given a set of distinct integers, nums, return all possible subsets (the power set).

Note: The solution set must not contain duplicate subsets.

For example,
If nums = [1,2,3], a solution is:

[
  [3],
  [1],
  [2],
  [1,2,3],
  [1,3],
  [2,3],
  [1,2],
  []
]
本题主要有三个方法,具体的代码如下。

第一个是动态规划的方法。

  
    def subsets(self, nums):  #43%,69ms
        """ 
        :type nums: List[int] 
        :rtype: List[List[int]] 
        """  
        result = self.subset_func(nums)  
        for line in result:  
            line.sort()  
        return result  
          
    def subset_func(self,nums):  
        if len(nums)==0:  
            return [[]]  
        if len(nums)==1:  
            return [[],nums]  
        first = nums[0]  
        tmp_nums = nums[1:]  
        tmp_result = self.subset_func(tmp_nums)  
        result = []  
        for key in tmp_result:  #动态规划的方法,result包括tmp_result的所有的,还包括tep_result都加上first
            result.append(key)  
            tmp = list(key)  
            tmp.append(first)  
            result.append(tmp)  
        return result 

第二个是中间变量的方法。

    def subsets(self, nums):  #43%,69ms
        """ 
        :type nums: List[int] 
        :rtype: List[List[int]] 
        """  
   
        
    
        res = [[]]   #中间变量法
        for num in nums :  
            for temp in res[:] :  #这个地方为什么要用分片啊 Time Limit Exceeded,这个地方一定要带切片啊,调试时出现大bug啊,原因是如果不带分片,就是一个浅拷贝,后面res有变化,导致res不断增加,for循环一直进行下去啊
                x = temp[:]  #会改变原来的,浅拷贝x=temp
                x.append(num)  
                res.append(x)  
        return res
第三个是回溯的方法
   def subsets(self, nums):  #43%,69ms
        """ 
        :type nums: List[int] 
        :rtype: List[List[int]] 
        """  
   
   
        
        res=[]               #回溯法
        temp=[]
        def dfs(nums,res,start,temp):
            #x=copy.deepcopy(temp)
            x=temp[:]
            res.append(x)  #深拷贝与浅拷贝的问题,分片操作对多维数组来说也是浅拷贝啊
            for i in range(start,len(nums)):
                temp.append(nums[i])#添加第i个元素
                dfs(nums,res,i+1,temp)
                temp.remove(nums[i])#不添加
        dfs(nums,res,0,temp) # res=dfs(nums,res,0,temp)
        return res


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值