题目:组合总和
核心思路:每次添加元素之后都将target减少对应的值,直到等于或小于零
具体实现:
在回溯函数中首先判断target是否已经等于零——代表着当前元素的组合已经满足要求,可以压入res数组中
否则继续进行遍历与递归,直到出现满足总和要求的数组为止
在循环中要注意的是,当总和已经超出target时,就不要在把当前元素存入temp中了,而是直接跳过他,从下一个元素继续进行
1void backTrack(vector<int>& candidates, int target, int index, vector<int>& temp, vector<vector<int>>& res)
2{
3 if(target == 0)
4 {
5 res.push_back(temp);
6 return;
7 }
8
9 for(int i = index; i < candidates.size(); i++)
10 {
11 if(target - candidates[i] < 0) continue;
12 temp.push_back(candidates[i]);
13 backTrack(candidates, target - candidates[i], i, temp, res);
14 temp.pop_back();
15 }
16}
17vector<vector<int>> combinationSum(vector<int>& candidates, int target)
18{
19 vector<vector<int>> res;
20 vector<int> temp;
21 res.reserve(150);
22 backTrack(candidates, target, 0, temp, res);
23 return res;
24}