77. 组合
使用的是回溯算法。回溯算法很抽象,在递归的使用里边也算是比较难的,可以画一个树状图枚举一下。我们递归的操作其实就是在对树状图进行遍历。在每层的for循环里边其实有一个剪枝操作,就是如果我们本层需要遍历的剩下的元素已经太少了不够构成path结果集,那么我们就放弃之后的所有遍历。这样在基数特别大的时候就能减少很多负担!
class Solution {
public:
vector<int> path;
vector<vector<int>> result;
vector<vector<int>> combine(int n, int k) {
backtracking(n,k,1);
return result;
}
void backtracking(int n,int k,int startindex)
{
if(path.size()==k)
{
result.push_back(path);
return ;
}
for(int i=startindex;i<=n-(k-path.size())+1;i++)
{
path.push_back(i);
backtracking(n,k,i+1);
path.pop_back();
}
}
};