1 给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。 2 3 candidates 中的数字可以无限制重复被选取。 4 5 说明: 6 7 所有数字(包括 target)都是正整数。 8 解集不能包含重复的组合。 9 示例 1: 10 11 输入: candidates = [2,3,6,7], target = 7, 12 所求解集为: 13 [ 14 [7], 15 [2,2,3] 16 ] 17 示例 2: 18 19 输入: candidates = [2,3,5], target = 8, 20 所求解集为: 21 [ 22 [2,2,2,2], 23 [2,3,3], 24 [3,5] 25 ] 26 27 来源:力扣(LeetCode) 28 链接:https://leetcode-cn.com/problems/combination-sum 29 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
注意点:
1.最终结果集不能放在递归函数的参数列表中
2.部分递归的参数 在递归前修改的,递归后修改回来
3.适应题目要求,对递归参数进行调整
1 vector<vector<int>> res; 2 vector<int> temp; 3 4 void combine(int sum, int target, vector<int> candidates,int index) 5 { 6 if (sum == target) 7 { 8 res.push_back(temp); 9 return; 10 } 11 int can_size = candidates.size(); 12 for (int i = index; i <= can_size - 1; ++i) 13 { 14 if (sum + candidates[i] <= target) 15 { 16 sum += candidates[i]; 17 temp.push_back(candidates[i]); 18 combine(sum, target, candidates,i); 19 sum -= candidates[i]; 20 temp.pop_back(); 21 } 22 else if (sum + candidates[i] > target) 23 break; 24 } 25 } 26 vector<vector<int>> combinationSum(vector<int>& candidates, int target) { 27 if (candidates.size() == 0) 28 return res; 29 sort(candidates.begin(), candidates.end()); 30 31 combine(0,target,candidates,0); 32 return res; 33 }
参考博客 http://ju.outofmemory.cn/entry/371340
1 给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。 2 3 candidates 中的每个数字在每个组合中只能使用一次。 4 5 说明: 6 7 所有数字(包括目标数)都是正整数。 8 解集不能包含重复的组合。 9 示例 1: 10 11 输入: candidates = [10,1,2,7,6,1,5], target = 8, 12 所求解集为: 13 [ 14 [1, 7], 15 [1, 2, 5], 16 [2, 6], 17 [1, 1, 6] 18 ] 19 示例 2: 20 21 输入: candidates = [2,5,2,1,2], target = 5, 22 所求解集为: 23 [ 24 [1,2,2], 25 [5] 26 ] 27 28 来源:力扣(LeetCode) 29 链接:https://leetcode-cn.com/problems/combination-sum-ii 30 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 31 32 vector<vector<int>> res; 33 vector<int> temp; 34 void combine(int sum, int target, vector<int> candidates,int index) 35 { 36 if (sum == target) 37 { 38 res.push_back(temp); 39 return; 40 } 41 int can_size = candidates.size(); 42 for (int i = index; i <= can_size - 1; ++i) 43 { 44 if (i > index&&candidates[i] == candidates[i - 1]) 45 continue; 46 if (sum + candidates[i] <= target) 47 { 48 sum += candidates[i]; 49 temp.push_back(candidates[i]); 50 combine(sum, target, candidates,i+1); 51 sum -= candidates[i]; 52 temp.pop_back(); 53 } 54 else if (sum + candidates[i] > target) 55 break; 56 } 57 } 58 vector<vector<int>> combinationSum2(vector<int>& candidates, int target) 59 { 60 if (candidates.size() == 0) 61 return res; 62 sort(candidates.begin(), candidates.end()); 63 64 combine(0,target,candidates,0); 65 return res; 66 }
1 找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。 2 3 说明: 4 5 所有数字都是正整数。 6 解集不能包含重复的组合。 7 示例 1: 8 9 输入: k = 3, n = 7 10 输出: [[1,2,4]] 11 示例 2: 12 13 输入: k = 3, n = 9 14 输出: [[1,2,6], [1,3,5], [2,3,4]] 15 16 来源:力扣(LeetCode) 17 链接:https://leetcode-cn.com/problems/combination-sum-iii 18 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 19 20 vector<vector<int>> res; 21 vector<int> temp; 22 23 void combine(int k, int n, int num, int sum ,int index) 24 { 25 if (k == num && n == sum) 26 { 27 res.push_back(temp); 28 return; 29 } 30 else if (num > k || sum > n) 31 return; 32 for (int i = index; i <= 9; ++i) 33 { 34 if (num<k && sum + i <=n) 35 { 36 temp.push_back(i); 37 combine(k, n,num+1,sum+i ,i+1); 38 temp.pop_back(); 39 } 40 else if(num>=k || sum>=n) 41 break; 42 } 43 }