返回[1,n]中k个数的组合 元素不可以重复使用
回溯三部曲
1)参数和返回值? ?void n k
2)终止条件? ?叶子节点的大小为2? 终止,放到数组中
3)单层递归逻辑?
代码
class Solution {
public:
vector<int> path;//存放单个组合
vector<vector<int>> result;//存放全部组合
void backtracking(int n,int k,int startIndex){
//终止条件 path中有两个元素
if(path.size()==k){
result.push_back(path);
return;
}
//单层递归逻辑
//遍历以startIndex开头的各个元素
for(int i=startIndex;i<=n;i++){//注意这里是可以等于n的,题目给定的是左闭右闭区间
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 result;
}
};
剪枝
代码
class Solution {
public:
vector<int> path;//存放单个组合
vector<vector<int>> result;//存放全部组合
void backtracking(int n,int k,int startIndex){
//终止条件 path中有两个元素
if(path.size()==k){
result.push_back(path);
return;
}
//单层递归逻辑
//遍历以startIndex开头的各个元素
for(int i=startIndex;i<=n-(k-path.size())+1;i++){//注意这里是可以等于n的,题目给定的是左闭右闭区间
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 result;
}
};