给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
示例:
输入: [1,2,2]
输出:
[
[2],
[1],
[1,2,2],
[2,2],
[1,2],
[]
]
class Solution {
public:
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
vector<int> item;
vector<vector<int> > result;
set<vector<int> > res_set;
sort(nums.begin(),nums.end());
result.push_back(item);
generate(0,nums,item,result,res_set);
return result;
}
private:
void generate(int i,vector<int> &nums,vector<int> item,vector<vector<int> > &result,set<vector<int> > &res_set){
if(i>=nums.size())
return;
item.push_back(nums[i]);
if(res_set.find(item)==res_set.end()){
result.push_back(item);
res_set.insert(item);
}
generate(i+1,nums,item,result,res_set);
item.pop_back();
generate(i+1,nums,item,result,res_set);
}
};
剪枝问题:
给定一个数组 candidates
和一个目标数 target
,找出 candidates
中所有可以使数字和为 target
的组合。
candidates
中的每个数字在每个组合中只能使用一次。
说明:
- 所有数字(包括目标数)都是正整数。
- 解集不能包含重复的组合。
示例 1:
输入: candidates =[10,1,2,7,6,1,5]
, target =8
, 所求解集为: [ [1, 7], [1, 2, 5], [2, 6], [1, 1, 6] ]
示例 2:
输入: candidates = [2,5,2,1,2], target = 5,
所求解集为:
[
[1,2,2],
[5]
]
class Solution {
public:
vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
vector<int> item;
vector<vector<int> > result;
set<vector<int> > res_set;
sort(candidates.begin(),candidates.end());
generate(0,0,target,candidates,item,result,res_set);
return result;
}
private:
void generate(int i,int sum,int target,vector<int> &nums,vector<int> item,vector<vector<int> > &result,set<vector<int> > &res_set){
if(i>=nums.size()||sum>target)
return;
item.push_back(nums[i]);
sum+=nums[i];
if(sum==target&&res_set.find(item)==res_set.end()){
result.push_back(item);
res_set.insert(item);
}
generate(i+1,sum,target,nums,item,result,res_set);
item.pop_back();
sum-=nums[i];
generate(i+1,sum,target,nums,item,result,res_set);
}
};
括号匹配问题
给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。
例如,给出 n = 3,生成结果为:
[ "((()))", "(()())", "(())()", "()(())", "()()()" ]
class Solution {
public:
vector<string> generateParenthesis(int n) {
vector<string> result;
generate("",n,n,result);
return result;
}
private:
void generate(string item , int left,int right,vector<string> &result)
{
if(left==0&&right==0){
result.push_back(item);
return;
}
if(left>0)
generate(item+"(",left-1,right,result);
if(left<right)
generate(item+")",left,right-1,result);
}
};