[78] 子集
📝 题目描述
难度: 🟡 中等
标签:数组回溯
给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。
解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。
示例 1:
输入:nums = [1,2,3]
输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]
示例 2:
输入:nums = [0]
输出:[[],[0]]
� 解题思路
对于回溯算法,首先可以先建立一个决策树,查看可以形成递归的情况,以及需要回溯的节点。
在该题中,可以将数组每个数字元素看成一个选择或不选择的节点,建立一个决策树,数组的所有元素从前到后依次选择或者不选择。
� 代码实现
cpp
class Solution {
public:
vector<vector<int>> subsets(vector<int>& nums) {
vector<vector<int>> res;
vector<int> vec;
dfs(nums,res,vec,0);
return res;
}
void dfs(vector<int> &nums,vector<vector<int>>&res,vector<int>vec,int start)
{
if(start==nums.size()){
res.emplace_back(vec);
return;
}
// 不取该节点的情况
dfs(nums,res,vec,start+1);
// 取该节点的情况
vec.emplace_back(nums[start]);
dfs(nums,res,vec,start+1);
vec.pop_back();
}
};
📊 复杂度分析
所有子集都有选或不选两种状态,且每种状态最后都要进行一次push back(),平均长度n/2需要n/2时间,所以总时间复杂度为n*2^n。
栈一共递归调用n层,每层共同引用一个空间vec,最长为n,故空间复杂度为n
- 时间复杂度: O(n*2^n)
- 空间复杂度: O(n)
日期: 2026-4-29