<aside> 💡
回溯三部曲:
vector<int> cur;
vector<vector<int>> ans;
void backtracking(int i, int n, int k) {
if (cur.size() == k) {
ans.push_back(cur);
return;
}
for (int j = i; j <= n; ++j) {
cur.push_back(j);
backtracking(j + 1, n, k);
cur.pop_back();
}
}
vector<vector<int>> combine(int n, int k) {
backtracking(1, n, k);
return ans;
}
<aside> 💡
进阶:剪枝:
原循环终止条件:i <= n;
i <= n - (k - cur.size()) + 1
n - i + 1 >= k - size
n - i + 1
代表当前序列中还剩下的元素个数(+1代表包括了当前节点)
vector<vector<int>> ans;
vector<int> cur;
void backtracking(int num, int& k, int& n) {
// 终止条件:数组长度为k
if (cur.size() == k) {
// 保存结果
ans.push_back(cur);
return;
}
for (int i = num + 1; i <= n - (k - cur.size()) + 1; ++i) {
// 进行节点操作
cur.push_back(i);
// 递归
backtracking(i, k, n);
// 还原节点操作(回溯)
cur.pop_back();
}
}
vector<vector<int>> combine(int n, int k) {
backtracking(0, k, n);
return ans;
}