Subsets and Subsets II
阿新 • • 發佈:2019-02-19
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();
}
}
};