79)所有子集
class Solution{
private:
vector<vector<int>> res;
vector<int> path;
public:
vector<vector<int>> subsets(vector<int>& nums){
backtrack(nums, 0);
return res;
}
void backtrack(vector<int>& nums, int start){
res.push_back(path);
for(int i=start; i<nums.size(); i++){
path.push_back(nums[i]);
backtrack(nums, i+1);
path.pop_back();
}
}
};
80)含有k个元素的组合
class Solution{
private:
vector<vector<int>> res;
vector<int> path;
public:
vector<vector<int>> combine(int n, int k){
backtrack(n, k, 1);
return res;
}
void backtrack(int n, int k, int start){
if(path.size()==k) res.push_back(path);
for(int i=start; i<=n; i++){
path.push_back(i);
backtrack(n, k, i+1);
path.pop_back();
}
}
};
81)允许重复选择元素的组合
class Solution{
private:
vector<vector<int>> res;
vector<int> path;
int sum;
public:
vector<vector<int>> combinationSum(vector<int>& candidates, int target){
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++){
path.push_back(candidates[i]);
backtrack(candidates, target, i, sum+candidates[i]);
path.pop_back();
}
}
};