思路:回溯 + 剪枝
- 此题是经典的“以数组最后一个元素作为叶子节点”的组合类型回溯问题
- 每个数字最多只可以用一次,所以循环从
cur_index
开始循环 - 脑子里面要有图,这题就不画了,可以看其他类似题目中画的图
-
代码:
class Solution {
public:
void backTrace(vector<vector<int>>& combina_vector ,vector<int>& cur_combina, int cur_index , int k, int n) {
if (cur_index > 10) {
return;
}
if (cur_combina.size() == k) {
// cout << accumulate(cur_combina.begin(), cur_combina.end(), 0) << endl;
if (accumulate(cur_combina.begin(), cur_combina.end(), 0) == n) {
combina_vector.push_back(cur_combina);
}
return;
}
for (int i = cur_index ;i <= 9; i++) {
cur_combina.push_back(i);
backTrace(combina_vector, cur_combina, i + 1, k, n);
cur_combina.pop_back();
}
}
vector<vector<int>> combinationSum3(int k, int n) {
vector<vector<int>> combina_vector;
vector<int> cur_combina;
backTrace(combina_vector, cur_combina, 1, k, n);
return combina_vector;
}
};