|
18 | 18 |
|
19 | 19 | # 思路 |
20 | 20 |
|
| 21 | +这道题目注意一下几点: |
| 22 | + |
| 23 | +* 解集不能包含重复的组合。 说明不用去重了,难度就小一些。 |
| 24 | +* 求的是组合,那么集合没有顺序,for里面依然要从startIndex开始(如果是排列的话,就从0开始) |
| 25 | + |
| 26 | +本题k相当于限制了树的深度,9就是树的宽度。 |
| 27 | + |
| 28 | +选取过程如图: |
| 29 | + |
| 30 | +<img src='../pics/216.组合总和III.png' width=600> </img></div> |
| 31 | + |
| 32 | +那么这还是一道标准的模板题,模板: |
| 33 | + |
| 34 | +``` |
| 35 | +backtracking() { |
| 36 | + if (终止条件) { |
| 37 | + 存放结果; |
| 38 | + } |
| 39 | +
|
| 40 | + for (选择:选择列表(可以想成树中节点孩子的数量)) { |
| 41 | + 递归,处理节点; |
| 42 | + backtracking(); |
| 43 | + 回溯,撤销处理结果 |
| 44 | + } |
| 45 | +} |
| 46 | +``` |
| 47 | + |
| 48 | + |
21 | 49 |
|
22 | 50 | # C++代码 |
23 | 51 |
|
24 | 52 | ``` |
25 | 53 | class Solution { |
26 | 54 | private: |
27 | 55 | vector<vector<int>> result; |
28 | | - void backtracking(int target, int k, vector<int>& vec, int num, int sum, int startIndex) { |
| 56 | + vector<int> path; |
| 57 | + void backtracking(int target, int k, int num, int sum, int startIndex) { |
29 | 58 | if (sum > target || num > k) { |
30 | 59 | return; |
31 | 60 | } |
32 | 61 | if (num == k && sum == target) { |
33 | | - result.push_back(vec); |
| 62 | + result.push_back(path); |
34 | 63 | return; |
35 | 64 | } |
36 | 65 |
|
37 | 66 | for (int i = startIndex; i <= 9; i++) { |
38 | 67 | sum += i; |
39 | | - vec.push_back(i); |
| 68 | + path.push_back(i); |
40 | 69 | num++; |
41 | | - backtracking(target, k, vec, num, sum, i + 1); |
| 70 | + backtracking(target, k, num, sum, i + 1); |
42 | 71 | num--; |
43 | 72 | sum -= i; |
44 | | - vec.pop_back(); |
| 73 | + path.pop_back(); |
45 | 74 | } |
46 | 75 | } |
47 | 76 |
|
48 | 77 | public: |
49 | 78 | vector<vector<int>> combinationSum3(int k, int n) { |
50 | | - vector<int> vec; |
51 | | - backtracking(n, k, vec, 0, 0, 1); |
| 79 | + backtracking(n, k, 0, 0, 1); |
52 | 80 | return result; |
53 | 81 |
|
54 | 82 | } |
|
0 commit comments