编程问题:
找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。
说明:
- 所有数字都是正整数。
- 解集不能包含重复的组合。
示例:
- 输入: k = 3, n = 7
输出: [[1,2,4]] - 输入: k = 3, n = 9
输出: [[1,2,6], [1,3,5], [2,3,4]]
解法:
1.搜索回溯
时间复杂度O(组合数×k),其中 M 为集合的大小,本题中 M 固定为 9,每个组合判断需要的时间代价是 O(k)。
空间复杂度O(M)。combine的空间代价是 O(k),递归栈空间的代价是 O(M),故空间复杂度为 O(M + k) = O(M)。
class Solution {
private:
void dfs(vector<vector<int>>& res, vector<int>& combine, int k, int n, int idx)
{
if (combine.size() == k || n <= 0)
{
//如果找到一组合适的就把他加入到res中
if (combine.size() == k && n == 0)
res.push_back(combine);
return;
}
// dfs(nums, res, combine, k, n, idx + 1);
// if(n - nums[idx] >= 0)
// {
// combine.emplace_back(nums[idx]);
// dfs(nums, res, combine, k, n-nums[idx], idx + 1);
// combine.pop_back();
// }
for (int i = idx; i <= 9; i++) {
//选择当前值
combine.emplace_back(i);
//递归
dfs(res, combine, k, n - i, i + 1);
//撤销选择
combine.pop_back();
}
}
public:
vector<vector<int>> combinationSum3(int k, int n) {
vector<vector<int>> res;
vector<int> combine;
dfs(res, combine, k, n, 1);
return res;
}
};