17. 子集(Subsets)

17. 子集

中文English

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

样例

样例 1:

输入:[0]
输出:
[
  [],
  [0]
]

样例 2:

输入:[1,2,3]
输出:
[
  [3],
  [1],
  [2],
  [1,2,3],
  [1,3],
  [2,3],
  [1,2],
  []
]

挑战

你可以同时用递归与非递归的方式解决么?

注意事项

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

输入测试数据 (每行一个参数)如何理解测试数据?
DFS + 回溯
class Solution:
    """
    @param nums: A set of numbers
    @return: A list of lists
    """
    '''
    大致思路:
    1.循环,取出所有符合的子集,最后加[]进来,返回
    '''
    def subsets(self, nums):
        #dfs方法
        
        results = []
        nums.sort()
        self.dfs(results, [], nums, 0)
        return results
        
        
    #递归的定义
    def dfs(self, results, array, nums, curindex):
        #递归的出口,注意,这里如果是往下走不了的话,不用加return
        if array not in results:
            results.append(list(array))
        
        #递归的拆解
        for i in range(curindex, len(nums)):
            array.append(nums[i])
            self.dfs(results, array, nums, i + 1)
            array.pop()
        
        
            

 

18. 子集 II

中文English

给定一个可能具有重复数字的列表,返回其所有可能的子集。

样例

样例 1:

输入:[0]
输出:
[
  [],
  [0]
]

样例 2:

输入:[1,2,2]
输出:
[
  [2],
  [1],
  [1,2,2],
  [2,2],
  [1,2],
  []
]

挑战

你可以同时用递归与非递归的方式解决么?

注意事项

  • 子集中的每个元素都是非降序的
  • 两个子集间的顺序是无关紧要的
  • 解集中不能包含重复子集

 

class Solution:
    """
    @param nums: A set of numbers.
    @return: A list of lists. All valid subsets.
    """
    def subsetsWithDup(self, nums):
        # write your code here
        #dfs写法 + 回溯 
        
        results = []
        nums.sort()
        self.dfs(results, [], nums, 0)
        return results 
        
        
    #递归的定义
    def dfs(self, results, array, nums, curindex):
        #递归的出口
        if array not in results:
            results.append(list(array))
        
        #递归的拆解
        for i in range(curindex, len(nums)):
            array.append(nums[i])
            #其中i + 1,则下一次会自动从下一个元素开始,不会在取这次元素
            self.dfs(results, array, nums, i + 1)
            array.pop()

 

posted @ 2020-08-02 22:40  风不再来  阅读(416)  评论(0编辑  收藏  举报