在已经会这道题的基础上,但想不明白到底如何写成优化(剪枝)代码的,往下面看(字迹不怎么工整,还请见谅~)
先来简单看看代码吧~~具体如何剪枝在代码后面
class Solution {
public:
vector<int> vec;
vector<vector<int>> result;
// 是 1-n,遍历的时候要等于 n
// start 是遍历的起始位置
void backtracking(int n, int start, int k) {
if (vec.size() == k) {
result.push_back(vec); // 收集结果
return;
}
// n - i + 1 >= k - vec.size()
// 化简为: i <= n - (k - vec.size()) + 1
for (int i = start; i <= n - (k - vec.size()) + 1; i++) {
vec.push_back(i);
backtracking(n, i + 1, k);
vec.pop_back(); // 回溯
}
}
vector<vector<int>> combine(int n, int k) {
backtracking(n, 1, k); // 1-n 从 1 开始,小于等于 n
return result;
}
};