题目叙述:
找出所有相加之和为 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]]
解题思路:
这道题很明显要使用递归回溯来解决。
根据递归的三部曲:确定返回参数,确定终止条件,确定迭代过程。
我是在迭代过程中依次将值加入进vector数组里,然后在终止条件中判断是否等于n,再返回。
优化:只要sum大于n了,就不再继续递归。
class Solution {
public:
vector<int>path;
vector<vector<int>>result;
void dfs(int k,int n,int startindex)
{
if(path.size()==k)
{
int sum=0;
for(int i=0;i<k;i++)
{
sum+=path[i];
}
if(sum==n)
{
result.push_back(path);
return;
}
if(sum>n) return; //剪枝
}
for(int i=startindex;i<=9;i++)
{
path.push_back(i);
dfs(k,n,i+1);
path.pop_back();
}
}
vector<vector<int>> combinationSum3(int k, int n) {
dfs(k,n,1);
return result;
}
};