77.组合
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Solution {
public:
vector<vector<int>> result;
vector<int> path;
void backtrace(int n, int k, int start, int note) {
if (note == k) { // 终止条件
result.push_back(path);
return;
}
for (int i = start; i <= n; i++) {
path.push_back(i);
note++;
backtrace(n, k, i + 1, note);
path.pop_back();
note--;
}
}

vector<vector<int>> combine(int n, int k) {
backtrace(n, k, 1, 0);
return result;
}
};

note 记录已存储路径的长度,用以终止回溯,终止条件是回溯当中不可获取的。

组合不在意顺序,因此 [1,4] 和 [4,1] 属于同一个路径,不能同时加入到总路径中,只能取其一。为了方便,按照有序进行排布会容易做题,在代码中也是通过 i + 1 传递 到 backtrace 中作为 start 参数,表示遍历路径的起始位置。

回溯的体现就在于,你添加的操作在从 backtrace 结束之后对应的删除操作,比方说 path.push_back(i) 对应 path.pop_back()note++ 对应 note--

组合.png