This commit is contained in:
youngyangyang04
2020-09-11 09:43:08 +08:00
parent 1d11467a29
commit 5c41c069f2
3 changed files with 36 additions and 8 deletions

View File

@@ -18,6 +18,34 @@
# 思路
这道题目注意一下几点:
* 解集不能包含重复的组合。 说明不用去重了,难度就小一些。
* 求的是组合那么集合没有顺序for里面依然要从startIndex开始如果是排列的话就从0开始
本题k相当于限制了树的深度9就是树的宽度。
选取过程如图:
<img src='../pics/216.组合总和III.png' width=600> </img></div>
那么这还是一道标准的模板题,模板:
```
backtracking() {
if (终止条件) {
存放结果;
}
for (选择:选择列表(可以想成树中节点孩子的数量)) {
递归,处理节点;
backtracking();
回溯,撤销处理结果
}
}
```
# C++代码
@@ -25,30 +53,30 @@
class Solution {
private:
vector<vector<int>> result;
void backtracking(int target, int k, vector<int>& vec, int num, int sum, int startIndex) {
vector<int> path;
void backtracking(int target, int k, int num, int sum, int startIndex) {
if (sum > target || num > k) {
return;
}
if (num == k && sum == target) {
result.push_back(vec);
result.push_back(path);
return;
}
for (int i = startIndex; i <= 9; i++) {
sum += i;
vec.push_back(i);
path.push_back(i);
num++;
backtracking(target, k, vec, num, sum, i + 1);
backtracking(target, k, num, sum, i + 1);
num--;
sum -= i;
vec.pop_back();
path.pop_back();
}
}
public:
vector<vector<int>> combinationSum3(int k, int n) {
vector<int> vec;
backtracking(n, k, vec, 0, 0, 1);
backtracking(n, k, 0, 0, 1);
return result;
}