找出所有相加之和为 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]]
分析:
回溯,着重是backtracking中的写法,for(int i = startIndex; i <= 9; i++)循环中模拟了一个树的向下递归和向上回溯的过程,以递归调用为分界线,上面的代码为从上至下,下面的代码为从下至上,代码如下:
class Solution {
private:
vector<vector<int>> result;
vector<int> path;
void backtracking(int k, int n, int sum, int startIndex){
if(sum > n) return; // 剪枝
if(path.size() == k){
if(sum == n){
result.push_back(path);
return;
}
}
for(int i = startIndex; i <= 9; i++){
sum += i; // 处理累加
path.push_back(i); // 处理
backtracking(k, n, sum, i + 1); // 递归
// 一旦完成了递归的调用就准备向上回溯
sum -= i; // 回溯
path.pop_back(); // 回溯
}
}
public:
vector<vector<int>> combinationSum3(int k, int n) {
backtracking(k, n, 0, 1);
return result;
}
};