给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
示例:
输入: nums = [1,2,3]
输出:
[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
[]
]
一、思路
(一)回溯算法
求全部子集,这一类包含“全部”字样的问题都能使用回溯算法解决
问题在于,这里子集的长度不一,需要设置一个长度,当满足该长度时,才可返回
C++代码:
class Solution {
public:
vector<vector<int>> ans;
vector<vector<int>> subsets(vector<int>& nums) {
vector<int> subset;
for (int len = 0; len <= nums.size(); len++)
backTracking(nums, subset, 0, len);
return ans;
}
void backTracking(vector<int>& nums, vector<int>& subset, int pos, int len) {
if (subset.size() == len) {
ans.push_back(subset);
return;
}
for (int i = pos; i < nums.size(); i++) {
subset.push_back(nums[i]);
backTracking(nums, subset, i + 1, len);
subset.pop_back();
}
}
};
执行效率:
(二)深度优先搜索(DFS)
回溯算法其实也算DFS,直接使用DFS也可以解决这个问题
因为是寻找所有的子集,因此不再需要设置长度了
C++代码:
class Solution {
public:
vector<vector<int>> ans;
vector<vector<int>> subsets(vector<int>& nums) {
vector<int> subset;
dfs(nums, subset, 0);
return ans;
}
void dfs(vector<int>& nums, vector<int>& subset, int pos) {
ans.push_back(subset);
for (int i = pos; i < nums.size(); i++) {
subset.push_back(nums[i]);
dfs(nums, subset, i + 1);
subset.pop_back();
}
}
};
执行效率: