82)含有重复元素集合的组合
class Solution{
private:
vector<vector<int>> res;
vector<int> path;
int sum;
public:
vector<vector<int>> combinationSum2(vector<int>& candidates, int target){
sort(candidates.begin(), candidates.end());
backtrack(candidates, target, 0, 0);
return res;
}
void backtrack(vector<int>& candidates, int target, int start, int sum){
if(sum==target) res.push_back(path);
if(sum > target) return;
for(int i=start; i<candidates.size(); i++){
if(i!=start && candidates[i]==candidates[i-1]) continue;
path.push_back(candidates[i]);
backtrack(candidates, target, i+1, sum+candidates[i]);
path.pop_back();
}
}
};
83)没有重复元素集合的全排列
class Solution{
private:
vector<vector<int>> res;
vector<int> path;
public:
vector<vector<int>> permute(vector<int>& nums){
vector<int> vis(nums.size(), false);
backtrack(nums, vis);
return res;
}
void backtrack(vector<int>& nums, vector<int>& vis){
if(path.size()==nums.size()){
res.push_back(path);
return;
}
for(int i=0; i<nums.size(); i++){
if(vis[i]) continue;
path.push_back(nums[i]);
vis[i]=true;
backtrack(nums, vis);
vis[i]=false;
path.pop_back();
}
}
};
84)含有重复数字
class Solution{
private:
vector<vector<int>> res;
vector<int> path;
public:
vector<vector<int>> permuteUnique(vector<int>& nums){
vector<int> vis(nums.size(), false);
sort(nums.begin(), nums.end());
return res;
}
void backtrack(vector<int>& nums, vector<int>& vis){
if(path.size()==nums.size()){
res.push_back(path);
return;
}
for(int i=0; i<nums.size(); i++){
if(vis[i] || (i>0 && nums[i]==nums[i-1] && !vis[i-1])) continue;
path.push_back(nums[i]);
vis[i] = true;
backtrack(nums, vis);
vis[i] = false;
path.pop_back();
}
}
};