//1、组合问题:数组中的元素不可重复选,返回所有子集。
输入:nums = { 2,3,5 };
输出:{
[2],
[2,3],
[2,3,5]
[2,5]
[3,],
[3,5],
[5]
}
class Solution {
public:
vector<vector<int>> result;
vector<int> path;
vector<vector<int>> combinationSum2(vector<int>& candidates) {
backtracking(candidates, 0);
return result;
}
void backtracking(vector<int>& candidates, int index) {
if (index > candidates.size()) {
return;
}
if (path.size() > 0)
result.push_back(path);
for (int i = index; i < candidates.size(); i++) {
path.push_back(candidates[i]);
backtracking(candidates, i + 1);
path.pop_back();
}
}
};
*/2、组合问题:数组中和为8的元素,一个元素不可重复选。
输入:nums = { 2,3,5 }; target = 8;
输出:{
[3,5]
}
/
class Solution {
public:
vector<vector<int>> result;
vector<int> path;
vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
backtracking(candidates, target, 0, 0);
return result;
}
void backtracking(vector<int>& candidates, int target, int index, int nowSum) {
if (nowSum == target) {
result.push_back(path);
}
for (int i = index; i < candidates.size(); i++) {
path.push_back(candidates[i]);
nowSum += candidates[i];
backtracking(candidates, target, i + 1, nowSum);
nowSum -= candidates[i];
path.pop_back();
}
}
};
//3、组合问题:数组中和为8的元素,一个元素可被重复选。
*输入:nums = { 2,3,5 }; target = 8;
输出:{
[2,2,2,2],
[2,3,3],
[3,5]
}
/
class Solution {
public:
vector<vector<int>> result;
vector<int> path;
vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
backtracking(candidates, target, 0, 0);
return result;
}
void backtracking(vector<int>& candidates, int target, int index, int nowSum) {
if (nowSum == target) {
result.push_back(path);
return;
}
if (nowSum > target) {
return;
}
for (int i = index; i < candidates.size(); i++) {
path.push_back(candidates[i]);
nowSum += candidates[i];
backtracking(candidates, target, i, nowSum);
nowSum -= candidates[i];
path.pop_back();
}
}
};
//4、组合问题:数组中和为8 的元素(含有重复的元素),返回值不能包含重复的集合
输入:nums = { 2,3,3,5 }; target = 8;
输出:{
[2,3,3],
[3,5]
}
class Solution {
public:
vector<vector<int>> result;
vector<int> path;
vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
vector<bool> used(candidates.size(), 0);
sort(candidates.begin(), candidates.end());
backtracking(candidates, target, 0, 0, used);
return result;
}
void backtracking(vector<int>& candidates, int target, int index, int nowSum, vector<bool> used) {
if (nowSum > target) return;
if (nowSum == target) {
result.push_back(path);
return ;
}
for (int i = index; i < candidates.size(); i++) {
if (i > 0 && candidates[i] == candidates[i - 1] && used[i - 1] == 0) continue;
used[i] = 1;
path.push_back(candidates[i]);
nowSum += candidates[i];
backtracking(candidates, target, i + 1, nowSum, used);
nowSum -= candidates[i];
path.pop_back();
used[i] = 0;
}
}
};