子集

37 阅读1分钟

给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。
解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。

回溯法学习
  1. 画出递归树

回溯.svg\ 子集

  1. 找状态变量(递归函数的参数),注意这题和全排列不一样。全排列每颗子树高度都一样,而子集不一样,所以递归函数参数不同。递归函数的参数决定了搜寻空间的起始位置和深度。 全排列.svg\ 全排列
  2. 找搜寻列表,与状态变量结合,根据递归树,我们可以知道,每个子空间的搜寻空间是[状态变量,nums长度],且同一层的子空间的子树随着遍历的顺序改变。
  3. 因为每个路径都不重复,所以不需要剪枝。
  4. 选择,递归。
  5. 撤销选择。
class Solution(object):
    def subsets(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
        l = len(nums)
        def dfs(height):
            #由于本题for循环相当于确定了结束条件,所以不需要if条件确定结束条件
            result.append(path[:])
            #height是状态变量,range(height,l)确定需要搜索的空间
            for i in range(height,l):
                #作出选择
                path.append(nums[i])
                #dfs(状态变量),向dfs传递的参数确定接下来需要搜索的空间
                #这里不需要剪枝
                dfs(i + 1)
                #撤销
                path.pop()
        path = []  
        result = []
        dfs(0)
        return result