找出所有相加之和为 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]]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/combination-sum-iii
思路:分析DFS,需要的参数必然有数的个数,数的总和,在函数内部枚举第一个数,然后去递归枚举第二个数直到k个数,若满足条件就加入答案,由于不能有重复,所以枚举的时候确定一个顺序,顺序枚举就行,这样会避免1+2+4和4+1+2都出现,所以传参数还需要有一个枚举起点。
class Solution {
public:
vector<vector<int>> ans;
vector<int> path;
vector<vector<int>> combinationSum3(int k, int n) {
dfs(k,n,1);
return ans;
}
void dfs(int k,int n,int start)
{
if(!k){
if(!n)ans.push_back(path);
return;
}
//k个数,需要剩下的数有K个数,9-i+1>=k,则i<=10-k
for(int i=start;i<=10-k;++i){
if(n>=i){//只有n>=i的时候才能加进去
path.push_back(i);
dfs(k-1,n-i,i+1);
path.pop_back();
}
}
}
};