LeetCode 78 Subsets (Python详解及实现)

【题目】

Given a set of distinct integers, nums,return all possible subsets.

 

Note: The solution set must not containduplicate subsets.

 

For example,

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

 

[

 [3],

 [1],

 [2],

 [1,2,3],

 [1,3],

 [2,3],

 [1,2],

  []

]

给定一个数据集合,求该集合的所有子集。

 

【思路】

深度优先算法回溯:以【1,2,3】为例

每轮都传递一个数组起始指针的值,保证遍历顺序:

第一轮:先遍历以1 开头的所有子集,1→12→123 →13

第二轮:遍历以2开头的所有子集,2→23

第三轮:遍历以3开头的所有子集,3

这样三轮遍历保证能找到全部1开头,2开头,3开头的所有子集;同时,每轮遍历后又把上轮的头元素去掉,这样不会出现重复子集。(包括空集)

 

【Python实现】

  #每次调用dfs都传递数组S,会影响效率

     

class Solution(object):

   def subsets(self, nums):

       """

       :type nums: List[int]

       :rtype: List[List[int]]

       """

       if nums is None:

           return []

       res = []

       self.dfs(0, sorted(nums), res, [])

       return res

   def dfs(self, i, nums, res, subres):

       res.append(subres)

       print(res)

       for j in range(i, len(nums)):

           self.dfs(j+1, nums, res, subres + [nums[j]])

if __name__ == '__main__':

    S= Solution()

   S.subsets([1,2,3])

        

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值