Find all possible combinations of k numbers that add up to a number n, given that only numbers from 1 to 9 can be used and each combination should be a unique set of numbers.
Example 1:
Input: k = 3, n = 7
Output:
[[1,2,4]]
Example 2:
Input: k = 3, n = 9
Output:
[[1,2,6], [1,3,5], [2,3,4]]
同样是个递归回溯问题,需要考虑清楚其递归树,参考39. Combination Sum 。
解题代码
class Solution {
private:
vector<vector<int>> res;
// 从start开始找到k个数,让他们的和为n,c已存放前面的结果
void generateCombinations(int k, int n, int start,vector<int>& c){
// 递归终止
if (k == 0 && n == 0){
res.push_back(c);
return;
}
if (start > 9)return;
if (k <= 0)return;
if (n <= 0)return;
// 递归过程 , 数字从start到9去尝试
for (int i = start; i <= 9; i++)
{
c.push_back(i);
// 进行递归 , 下一次递归则是要求 从 [i+1 , 9]中选择k-1个数出来,让他们的和为n-i,c中已存放前面的结果
generateCombinations(k - 1, n - i, i + 1, c);
c.pop_back(); // 递归回溯
}
}
public:
vector<vector<int>> combinationSum3(int k, int n) {
// 初始
res.clear();
// 边界
if (k <= 0 || n <= 0)return res;
vector<int> c;
generateCombinations(k,n,1,c);
return res;
}
};
测试
class TestHelper{
Solution s;
public:
void run(){
vector<vector<int>> res = s.combinationSum3(3, 9);
// 显示结果信息
Utils::showVecInfo(res);
}
};
结果
vector<vector<int>> :
[
[ 1 2 6 ]
[ 1 3 5 ]
[ 2 3 4 ]
]
请按任意键继续. . .