给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。
解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。
回溯法学习
- 画出递归树
\ 子集
- 找状态变量(递归函数的参数),注意这题和全排列不一样。全排列每颗子树高度都一样,而子集不一样,所以递归函数参数不同。递归函数的参数决定了搜寻空间的起始位置和深度。
\ 全排列
- 找搜寻列表,与状态变量结合,根据递归树,我们可以知道,每个子空间的搜寻空间是
[状态变量,nums长度],且同一层的子空间的子树随着遍历的顺序改变。 - 因为每个路径都不重复,所以不需要剪枝。
- 选择,递归。
- 撤销选择。
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