题目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;}
};