题目描述
找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。(解集不能包含重复的组合)
输入: k = 3, n = 9
输出: [[1,2,6], [1,3,5], [2,3,4]]
解题思路
这个题是个常规的回溯题,依旧是用startNum
来保证每种组合不存在重复数字。
参考代码
class Solution {
public:
vector<vector<int>> combinationSum3(int k, int n) {
vector<vector<int> > res;
vector<int>tmp;
dfs(k, n, 1, tmp, res);
return res;
}
void dfs(int k, int n, int startNum, vector<int> &tmp, vector<vector<int> > &res){
if(n < 0) // 这个if可以不写
return;
if(k == 0){
if(n == 0)
res.push_back(tmp);
return;
}
// startNum 保证每种组合中不存在重复的数字。
for(int i = startNum; i <= 9; i++){
if(i > n) // 相当于剪枝
break;
tmp.push_back(i);
dfs(k - 1, n - i, i + 1, tmp, res);
tmp.pop_back();
}
}
};