78. 子集
78. 子集
题目链接:78. 子集
题目描述
给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。
解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。
核心思考:回溯法(选择与不选择)
本题是经典的状态空间搜索问题。对于数组中的每一个元素,我们都面临两种选择:将其纳入当前子集,或者不将其纳入当前子集。这种逻辑可以完美地通过深度优先搜索(DFS)即回溯法来实现。
- 递归决策树:设当前递归深度为
i,代表我们正在决定是否要选取nums[i]。 - 两条分支:
- 分支一(不选):直接递归进入下一层
dfs(i + 1)。 - 分支二(选):将
nums[i]加入当前路径path,然后递归进入下一层dfs(i + 1),完成后执行回溯操作path.pop()。
- 分支一(不选):直接递归进入下一层
- 终止条件:当
i到达数组长度n时,说明所有元素都已做过决策。此时将path的一个拷贝(切片path[:])存入结果集ans。
通过这种“选或不选”的二叉树路径搜索,我们可以不遗漏且不重复地遍历出所有共 $2^N$ 种可能。
解题思路 (Python)
1 | class Solution: |
复杂度分析
- 时间复杂度:$O(N \times 2^N)$,其中 $N$ 是数组的长度。总共有 $2^N$ 个子集,且每个子集的拷贝操作消耗 $O(N)$。
- 空间复杂度:$O(N)$。递归栈的最大深度为 $N$,且辅助路径数组
path的大小最大也为 $N$。