组合-回溯法
给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
candidates 中的数字可以无限制重复被选取。
说明:
所有数字(包括 target)都是正整数。
解集不能包含重复的组合。
示例 1: 输入:candidates = [2,3,6,7], target = 7, 所求解集为: [ [7], [2,2,3] ]
示例 2: 输入:candidates = [2,3,5], target = 8, 所求解集为: [ [2,2,2,2], [2,3,3], [3,5] ]
分析:先排序,再剪枝
#include "_myPrint.cpp"
using namespace std;
// https://leetcode-cn.com/problems/combination-sum/
class Solution{
private:
vector<vector<int>> res;
vector<int> path;
void backtracking(vector<int>& candidate, int target, int startindex){
if (target == 0){
res.push_back(path);
return;
}
// 剪枝优化 一定要先对candidate排序
for (int i = startindex; i < candidate.size() && target - candidate[i] >= 0; i++){
path.push_back(candidate[i]);
target -= candidate[i];
// 可以重复选取数字 这里的startindex不用加一
backtracking(candidate, target, i);
target += candidate[i];
path.pop_back();
}
}
public:
vector<vector<int>> combine1(vector<int>& candidate, int target){
res.clear();
path.clear();
sort(candidate.begin(), candidate.end());
backtracking(candidate, target, 0);
return res;
}
};
int main(){
Solution s;
vector<int> candidate = {2,6,3,7};
int target = 7;
vector<vector<int>> res = s.combine1(candidate, target);
printCollection p;
p.printVecVec(res);
}