您的位置:首页 > 其它

Subsets and Subsets II

2015-11-11 20:37 260 查看
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();
}
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  递归