题目
给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
示例:
输入: nums = [1,2,3]
输出:
[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
[]
]
思路
1.回溯
2.递归
类似题目
leetcode77. 组合
实现
class Solution {
public:
vector<vector<int>> subsets(vector<int>& nums) {
vector<int> tmp;
vector<vector<int>> res;
func(nums, &tmp, &res, 0);
return res;
}
void func(vector<int>& nums, vector<int>* tmp, vector<vector<int>>* res, int start) {
if (start <= nums.size()) {
res->push_back(*tmp);
}
for (int i = start; i < nums.size(); ++i) {
tmp->push_back(nums[i]);
func(nums, tmp, res, i + 1);
tmp->pop_back();
}
}
};
class Solution {
public:
vector<vector<int>> subsets(vector<int>& nums) {
vector<vector<int>> res;
vector<int> temp;
int len = nums.size();
res.push_back(temp);
for (int i = 1; i <=len; i++) {
func(res, temp, nums, 0, len - 1, i);
}
return res;
}
void func(vector<vector<int>>& res, vector<int>& temp, vector<int>& nums, int start, int end, int count) {
if (count == 1) {
for (int i = start; i <= end; i++) {
temp.push_back(nums[i]);
res.push_back(temp);
temp.pop_back();
}
return;
}
for (int i = start; i <= end - count + 1; i++) {
temp.push_back(nums[i]);
func(res, temp, nums, i + 1, end, count - 1);
temp.pop_back();
}
}
};