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>> result;
vector<int> path;
sort(nums.begin(),nums.end());
find(nums,0,result,path);
return result;
}
void find(vector<int> nums, int index, vector<vector<int>>& result, vector<int>& path){
if(index==nums.size())
result.push_back(path);
else{
find(nums,index+1,result,path);
path.push_back(nums[index]);
find(nums,index+1,result,path);
path.pop_back();
}
}
};
Given a collection of integers that might contain duplicates, 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,2], a solution is:
[
[2],
[1],
[1,2,2],
[2,2],
[1,2],
[]
]
跟第一题的解法一样,只是在主函数中添加了除去重复的函数就行了。
class Solution {
public:
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
vector<vector<int>> result;
vector<int> sub;
sort(nums.begin(),nums.end());
find(0,nums,sub,result);
sort(result.begin(),result.end());
result.erase( unique(result.begin(),result.end()), result.end());
return result;
}
void find(int index, vector<int>& nums, vector<int>& sub, vector<vector<int>>& result){
if(index<=nums.size())
result.push_back(sub);
for(int i=index;i<nums.size();i++){
sub.push_back(nums[i]);
find(i+1,nums,sub,result);
sub.pop_back();
}
}
};