题:找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。
思路:相对于回溯算法的组合问题77多了一个限制,即找到和为n的k个数的组合,而整个集合已经是固定的了[1,…,9]。
回溯三要素:
- 返回值和参数: void
参数:同组合问题,需要一个二维数组存放结果集合,和一个一维数组存放符合条件的结果。
vector<vector<int>> result;
vector<int> path;
此时还需要一个目标总和targetSum,一个已经存放的数path的和sum,数的个数k,遍历的起始位置startIndex,即
int targetSum;
int sum;
int k;
int startIndex;
void backtracking(int targetSum, int k, int sum, int startIndex)
- 终止条件:即当path的大小等于k时,停止,且path的和等于targetSum时终止。即
if(path.size()==K){
if(sum==targetSum)
result.push_back(path);
return;
}
- 单层搜索逻辑:处理过程就是 path收集每次选取的元素,相当于树型结构里的边,sum来统计path里元素的总和,for循环中i<=9。即
for(int i=startIndex;i<=9;i++){
sum +=i;
path.push_back(i);
backtracking(targetSum,k,sum,i+1);
sum -=i;
path.pop_back();
}
- 最后,就是主函数调用回溯算法,将参数填进去即可。
public:
vector<vector<int>> combinationSum3(int k, int n) {
backtracking(n, k, 0, 1);
return result;
}