题目描述
找出所有相加之和为 n 的 k 个数的组合,且满足下列条件:
只使用数字1到9
每个数字 最多使用一次
返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次,组合可以以任何顺序返回。
解题思想
使用回溯算法
代码
class Solution {
public:
vector<vector<int>> res;
vector<int> path;
int sum = 0;
void backTracking(int n,int k,int startIndex) {
if (path.size() == k && sum == n) {
res.push_back(path);
return;
}
for (int i = startIndex; i <= 9; i++) {
sum += i;
path.push_back(i);
//往下走 i+1
backTracking(n, k, i+1);
//回溯
path.pop_back();
sum -= i;
}
}
vector<vector<int>> combinationSum3(int k, int n) {
backTracking(n, k, 1);
return res;
}
};
使用剪枝优化
class Solution {
public:
vector<vector<int>> res;
vector<int> path;
int sum = 0;
void backTracking(int n, int k, int startIndex) {
//优化:在深度上进行剪枝操作
if (sum > n) return;
if (path.size() == k && sum == n) {
res.push_back(path);
return;
}
//优化:在宽度上进行剪枝操作 9-(k-path.size())+1
for (int i = startIndex; i <= 9-(k-path.size())+1; i++) {
sum += i;
path.push_back(i);
//往下走 i+1
backTracking(n, k, i + 1);
//回溯
path.pop_back();
sum -= i;
}
}
vector<vector<int>> combinationSum3(int k, int n) {
backTracking(n, k, 1);
return res;
}
};