找出所有相加之和为 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]]
思路分析:这种经典的组合、排序问题一般都是利用回溯法进行搜索。
class Solution {
public:
vector<vector<int>> result;
//从[lastSeletc + 1, 9]继续搜索剩下的remainN
void dfs(vector<int> &tempRes, int k, int step, int lastSelet, int remainN){
if (step >= k){//如果搜索完成
if (remainN == 0){//符合条件
result.push_back(tempRes);
}
return;
}
//为避免重复选择,这里只能选择比上一次大的元素
for (int beginSelet = lastSelet + 1; beginSelet <= 9; ++beginSelet){
//这里是一个剪枝算法
//beginSelet == remainN为正好搜索完毕的情况
//beginSelet * 2 < remainN 因为如果没有搜索结果必须选择beginSelet和一个大于beginSelet的元素
if (beginSelet == remainN || beginSelet * 2 < remainN){
tempRes.push_back(beginSelet);//放入中间结果
dfs(tempRes, k, step + 1, beginSelet, remainN - beginSelet);
tempRes.pop_back();//上一次搜索完成后需要将上一次放入的pop
}
}
}
vector<vector<int>> combinationSum3(int k, int n) {
vector<int> tempRes;//单个解
dfs(tempRes, k, 0, 0, n);//开始搜索
return result;
}
};