子集
给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
class Solution {
public:
vector<vector<int>> paths;
void track(vector<int>& nums, int start, vector<int>& tmp){
paths.push_back(tmp);
for(int i=start;i<nums.size();i++){
tmp.push_back(nums[i]);
track(nums,i+1,tmp);
tmp.pop_back();
}
return;
}
vector<vector<int>> subsets(vector<int>& nums) {
vector<int> tmp;
track(nums,0,tmp);
return paths;
}
};
子集2
给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
class Solution {
public:
vector<vector<int>> paths;
void track(vector<int>& nums, int start, vector<int>& tmp){
paths.push_back(tmp);
for(int i=start;i<nums.size();i++){
if (i > start && nums[i] == nums[i-1]){
continue;
}
tmp.push_back(nums[i]);
track(nums,i+1,tmp);
tmp.pop_back();
}
return;
}
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
vector<int> tmp;
sort(nums.begin(),nums.end());
track(nums,0,tmp);
return paths;
}
};
全排列
给定一个 没有重复 数字的序列,返回其所有可能的全排列。
思路:注意删除和添加vector元素时迭代器的行为
class Solution {
public:
vector<vector<int>> paths;
void track(vector<int>& nums, vector<int>& tmp){
int l=nums.size();
if(l==0){
paths.push_back(tmp);
return;
}
for(vector<int>::iterator it=nums.begin();it!=nums.end();){
int t=*it;
tmp.push_back(t);
it=nums.erase(it);
track(nums,tmp);
tmp.pop_back();
nums.insert(it,1,t);
it++;
}
return;
}
vector<vector<int>> permute(vector<int>& nums) {
vector<int> tmp;
track(nums,tmp);
return paths;
}
};
全排列2
给定一个可包含重复数字的序列,返回所有不重复的全排列。
class Solution {
public:
vector<vector<int>> paths;
void track(vector<int>& nums, vector<int>& tmp){
int l=nums.size();
if(l==0){
paths.push_back(tmp);
return;
}
int pre=-100000;
for(vector<int>::iterator it=nums.begin();it!=nums.end();){
int t=*it;
if(t==pre){
it++;
continue;
}
tmp.push_back(t);
it=nums.erase(it);
track(nums,tmp);
tmp.pop_back();
nums.insert(it,1,t);
pre=t;
it++;
}
return;
}
vector<vector<int>> permuteUnique(vector<int>& nums){
vector<int> tmp;
sort(nums.begin(),nums.end());
track(nums,tmp);
return paths;
}
};