39. 组合总和 ,40. 组合总和 II,216. 组合总和 III

 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 个数的组合。组合中只允许含有 19 的正整数,并且每种组合中不存在重复的数字。
 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 }

 

转载于:https://www.cnblogs.com/zouma/p/11253042.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值