找出所有相加之和为 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]]
思路:采用递归的做法,遍历每一种情况,控制递归的深度为k层,每次递推自身传入的区间范围都减少一,即从[start,end]减少到[start+1,end]。
参考代码:
class Solution {
public:
void combinationSum3Core(int k, int n,int start, int end, vector<vector<int>> &res, vector<int> tmp,int sum) {
if (k < 0) {
return;
}
if (k == 0 && sum == n) {
res.push_back(tmp);
return;
}
if (k == 0 && sum != n) {
return;
}
for (int i = start; i <= end; i++) {
tmp.push_back(i);
sum += i;
if (sum <= n) {
combinationSum3Core(k - 1, n,i+1, end, res, tmp, sum);
}
sum -= i;
tmp.pop_back();
}
}
vector<vector<int>> combinationSum3(int k, int n) {
vector<vector<int>> res;
vector<int> tmp;
int sum = 0;
combinationSum3Core(k, n, 1, 9,res,tmp,sum);
return res;
}
};