![在这里插入图片描述](https://img-blog.csdnimg.cn/2021031210123235.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1NMX1dvcmxk,size_16,color_FFFFFF,t_70)
1 回溯法(first索引)
class Solution {
private:
vector<vector<int>> solution;
vector<int> path;
public:
void backtrack(int n, int k, int first) {
if (path.size() == k) {
solution.emplace_back(path);
return;
}
for (int i = first; i < n; i++) {
path.emplace_back(i + 1);
backtrack(n, k, i + 1);
path.pop_back();
}
}
vector<vector<int>> combine(int n, int k) {
backtrack(n, k, 0);
return solution;
}
};
2 回溯法(first索引+索引距离n>还需元素个数剪枝)
本题可以加上剪枝,从而提高回溯效率
i
表示组合中的第1个元素, 若索引i
距离n
不到所需元素个数(k - path.size())
则break
for (int i = first; i < n; i++)
// 变为↓
for (int i = first; i <= n - (k - path.size()); i++)
完整代码如下
class Solution {
private:
vector<vector<int>> solution;
vector<int> path;
public:
void backtrack(int n, int k, int first) {
if (path.size() == k) {
solution.emplace_back(path);
return;
}
/**i表示组合中的第1个元素, 若索引i距离n不到所需元素个数(k - path.size())则break**/
for (int i = first; i <= n - (k - path.size()); i++) {
path.emplace_back(i + 1); // 初始索引first=0, 组合元素需+1
backtrack(n, k, i + 1);
path.pop_back();
}
}
vector<vector<int>> combine(int n, int k) {
backtrack(n, k, 0);
return solution;
}
};