题目
给你一个整数数组 nums
,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。
解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。
示例
示例 1:
输入:nums = [1,2,3] 输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]
示例 2:
输入:nums = [0] 输出:[[],[0]]
分析
要找出一个整数数组 nums
的所有可能子集(幂集),可以使用回溯算法。回溯算法是一种通过尝试所有可能的组合来解决问题的算法,在这个问题中,我们可以通过递归的方式来生成所有可能的子集。
回溯
算法思路
初始化结果集 :创建一个二维向量 result
用于存储所有的子集,初始时包含一个空子集。
回溯函数 :定义一个回溯函数 backtrack
,该函数接收当前子集、当前处理的元素索引和原数组作为参数。
- 终止条件:当处理完所有元素时,将当前子集加入结果集。
- 选择:对于当前元素,有两种选择:选择该元素加入当前子集,或者不选择该元素。
- 递归:分别进行选择和不选择的递归调用。
- 回溯:在递归调用返回后,撤销选择,以便尝试其他组合。
调用回溯函数:从索引 0 开始调用回溯函数。
返回结果集:返回存储所有子集的结果集。
时间复杂度:O(),
是数组的长度
空间复杂度:O()
cpp
class Solution {
private:
// 回溯函数
void backtrack(std::vector<int>& nums, int start, std::vector<int>& current, std::vector<std::vector<int>>& result) {
// 将当前子集加入结果集
result.push_back(current);
// 遍历剩余元素
for (int i = start; i < nums.size(); ++i) {
// 选择当前元素
current.push_back(nums[i]);
// 递归调用,处理下一个元素
backtrack(nums, i + 1, current, result);
// 回溯,撤销选择
current.pop_back();
}
}
public:
std::vector<std::vector<int>> subsets(std::vector<int>& nums) {
std::vector<std::vector<int>> result;
std::vector<int> current;
// 调用回溯函数
backtrack(nums, 0, current, result);
return result;
}
};