zoukankan      html  css  js  c++  java
  • LeetCode 78 [Subsets]

    原题

    给定一个含不同整数的集合,返回其所有的子集

    如果 S = [1,2,3],有如下的解:

    [
      [3],
      [1],
      [2],
      [1,2,3],
      [1,3],
      [2,3],
      [1,2],
      []
    ]

    子集中的元素排列必须是非降序的,解集必须不包含重复的子集

    解题思路

    • Backtracking, DFS
    • 数组要排序,接着一层一层的递归,每一层列表的元素个数加一
                                       [ ]
                                    /   |   
                                 [1]   [2]   [3]
                               /  |     |
                        [1, 2] [1, 3] [2, 3]
                          /
                    [1, 2, 3]

    完整代码

    # 递归的方法
    # class Solution(object):
    #     def subsets(self, nums):
    #         """
    #         :type nums: List[int]
    #         :rtype: List[List[int]]
    #         """
    #         if nums == None:
    #             return []
    #         res = [[]]
    #         self.dfs(sorted(nums), [], 0, res)
    #         return res
            
    #     def dfs(self, nums, path, index, res):
    #         for i in xrange(index, len(nums)):
    #             res.append(path + [nums[i]])
    #             self.dfs(nums, path + [nums[i]], i+1, res)
    
    # 迭代的方法
    # 循环元素,往结果列表中添加符合的元素,在循环第二个元素,并且跟之前的答案组合
    # 成为新的答案元素,直到循环结束
    class Solution(object):
        def subsets(self, nums):
            """
            :type nums: List[int]
            :rtype: List[List[int]]
            """
            nums.sort()
            result = [[]]
            for x in nums:
                with_x = []
                for s in result:
                    # 这里不能直接使用result,因为是循环result
                    with_x.append(s + [x])
                result += with_x
            return result
            
    

      

      

  • 相关阅读:
    快速排序算法
    DirectX9(翻译):介绍
    奇葩的面试题
    新博客
    OpenCV2:幼儿园篇 第八章 视频操作
    编程规范:位运算
    编程规范:allocator
    深浅copy和浅copy
    模块和包
    递归函数
  • 原文地址:https://www.cnblogs.com/LiCheng-/p/6625920.html
Copyright © 2011-2022 走看看