找出所有相加之和为 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 {
void dfs(vector<int> &candidates, vector<vector<int>> &vecRes, vector<int> &vecTmp, int target, int k, int index, int step)
{
for(int i = index; i < candidates.size(); i++)
{
if(target < candidates[i] || step > k)
{
return;
}
else if(target == candidates[i])
{
if(step == k)
{
vecTmp.push_back(candidates[i]);
vecRes.push_back(vecTmp);
vecTmp.pop_back(); //注意此处也需要回溯
return;
}
else
{
return;
}
}
else
{
vecTmp.push_back(candidates[i]);
dfs(candidates, vecRes, vecTmp, target-candidates[i], k, i+1, step+1);
vecTmp.pop_back();
}
}
}
public:
vector<vector<int>> combinationSum3(int k, int n) {
vector<vector<int>> vecRes;
if(k > 9 || n < (1+k)*k/2) return vecRes; //剔除掉不符合情况的输入
vector<int> vecTmp;
int numBuf[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
vector<int> candidates;
if(n < 9) //注意对n输入小于9时作区分
{
candidates.assign(numBuf, numBuf+n);
}
else
{
candidates.assign(numBuf, numBuf+9);
}
dfs(candidates, vecRes, vecTmp, n, k, 0, 1); //注意step步数从1开始
return vecRes;
}
};
典型的递归回溯的题目,注意结束的条件判断