题目;
Given a set of distinct integers, nums, return all possible subsets.
Note:
- Elements in a subset must be in non-descending order.
- The solution set must not contain duplicate subsets.
For example,
If nums = [1,2,3]
, a solution is:
[ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], [] ]
class Solution {
public:
vector<vector<int>> subsets(vector<int>& nums) {
vector<vector<int> > res;
if (nums.empty()) return res;
vector<int> oneSubset;
sort(nums.begin(), nums.end());//排序
subsetsCore(nums, 0, oneSubset, res);
return res;
}
private:
void subsetsCore(vector<int>& nums, int start, vector<int> oneSubset, vector<vector<int> > &res){
if (start == nums.size()){
res.push_back(oneSubset);
return;
}
subsetsCore(nums, start + 1, oneSubset, res);//start所指元素不在subset中
oneSubset.push_back(nums[start]);
subsetsCore(nums, start + 1, oneSubset, res);//start所指元素在subset中
}
};
注:由于题目中指明集合元素是“ distinct integers”,所以不必担心因含有重复元素而产生重复的子集的情况
下面是另一种思路,好像这种方法更通用一些,对于去重也比较方便
class Solution {
public:
vector<vector<int>> subsets(vector<int>& nums) {
vector<vector<int> > res;
if (nums.empty()) return res;
vector<int> oneSubset;
sort(nums.begin(), nums.end());
subsetsCore(nums, 0, oneSubset, res);
return res;
}
private:
void subsetsCore(vector<int> &nums, int start, vector<int> oneSubset, vector<vector<int> > &res){
res.push_back(oneSubset);
for(int i = start; i < nums.size(); ++i){
oneSubset.push_back(nums[i]);
subsetsCore(nums, i+1, oneSubset, res);
oneSubset.pop_back();
}
}
};