题目:
找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。
说明:
- 所有数字都是正整数。
- 解集不能包含重复的组合。
例:
输入: k = 3, n = 7
输出: [[1,2,4]]
来源:
解题思路:回溯
继续学习回溯的思想,本题与 上一篇(所有组合) 非常相似,直接借鉴。
- 递归终止条件:满足k个数
- 结果输出条件:满足k个数 && 满足sum
- 剪枝条件:当前虽然不足k个数,但其和即将超过目标值
c++代码:
class Solution {
public:
vector< vector<int> > result;
vector<int> path;
vector< vector<int> > combinationSum3(int k, int n) {
back(n, 0, k, 1);
return result;
}
// targetSum:目标和,固定值
// currentSum:当前path中的数字和,动态累加
void back(int targetSum, int currentSum, int k, int start) {
if (path.size() == k) {
if (currentSum == targetSum) {
result.push_back(path);
}
return;
}
for (int i = start; i <= 9; i++) {
if (currentSum + i > targetSum) break; // 剪枝,后面的数字已超出
currentSum += i;
path.push_back(i);
back(targetSum, currentSum, k, i+1);
currentSum -= i;
path.pop_back();
}
}
};