题目描述
给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。
你可以按 任何顺序 返回答案。
解题思想
使用回溯算法
代码
回溯算法模板
void backtracking(参数) {
if (终止条件) {
存放结果;
return;
}
for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {
处理节点;
backtracking(路径,选择列表); // 递归
回溯,撤销处理结果
}
}
class Solution {
public:
vector<int> path; //存放符合条件的结果
vector<vector<int>> res; //存放符合条件结果的集合
void backTracking(int n,int k,int startIndex) {
//终止条件
if (path.size() == k) {
res.push_back(path);
return;
}
for (int i = startIndex; i <= n; i++) {
path.push_back(i);
backTracking(n, k, i + 1);
//回溯
path.pop_back();
}
}
vector<vector<int>> combine(int n, int k) {
backTracking(n, k, 1);
return res;
}
};
使用剪枝优化
class Solution {
public:
vector<int> path; //存放符合条件的结果
vector<vector<int>> res; //存放符合条件结果的集合
void backTracking(int n, int k, int startIndex) {
//终止条件
if (path.size() == k) {
res.push_back(path);
return;
}
//剪枝操作:至多从哪里开始 i <= n-(k-path.size())+1
for (int i = startIndex; i <= n-(k-path.size())+1; i++) {
path.push_back(i);
backTracking(n, k, i + 1);
//回溯
path.pop_back();
}
}
vector<vector<int>> combine(int n, int k) {
backTracking(n, k, 1);
return res;
}
};