216. 组合总和 III

Posted zjuhaohaoxuexi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了216. 组合总和 III相关的知识,希望对你有一定的参考价值。

题目:

找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。

说明:

所有数字都是正整数。
解集不能包含重复的组合。
示例 1:

输入: k = 3, n = 7

输出: [[1,2,4]]
示例 2:

输入: k = 3, n = 9
输出: [[1,2,6], [1,3,5], [2,3,4]]

代码:

 

 1 class Solution {
 2 public:
 3     vector<vector<int>> combinationSum3(int k, int n) {
 4 
 5         vector<vector<int>> ret;
 6         if(k > 9)
 7             return ret;
 8         if(n < (1+k)*k/2)
 9             return ret;
10         vector<int> temp;
11         combinationSum3Core(1,k,n,0,temp,ret);
12         return ret;    
13     }
14     void combinationSum3Core(int start,int k,int n,int curSum,vector<int> &temp,vector<vector<int>> &ret)
15     {
16         if(temp.size() == k)
17         {
18             if(curSum == n)
19                 ret.push_back(temp);
20             return;
21         }
22         //这条语句可以去掉,因为这个剪枝操作:9-i+1 < k-temp.size()
23         // if(start > 9)
24         //     return;
25         for(int i = start;i <= 9;i++)
26         {
27             if(curSum+i > n || 9-i+1 < k-temp.size())//剪枝
28                 return;
29             temp.push_back(i);
30             combinationSum3Core(i+1,k,n,curSum+i,temp,ret);
31             temp.pop_back();
32         }
33 
34     }
35 };

 

以上是关于216. 组合总和 III的主要内容,如果未能解决你的问题,请参考以下文章

[回溯算法]leetcode216. 组合总和 III(c实现)

LeetCode216. 组合总和 III

216. 组合总和 III

216 Combination Sum III 组合总和 III

LeetCode 216. 组合总和 III(Combination Sum III)

216. 组合总和 III-----回溯篇4