题目1:77 组合
题目链接:77 组合
题意
返回[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;
}
};
- 时间复杂度: O(n * 2^n)
- 空间复杂度: O(n)
剪枝
代码
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;
}
};