77.组合
解题思路:这题给出了n和k两个数的数值,即在n个数中求出数量为k的组合,若k较小例如2,3则能够使用多层循环来解决,(k=2则使用两层for循环,k=3则使用三层for循环),然而当k的值较大的时候显然这样用暴力的循环解决是不现实的。所以本题可以使用回溯算法来解决,回溯算法实质上也是暴力搜索的一种方法,不过它能够实现一些使用多层for循环难以解决的问题。
所有的回溯算法都能够抽象成一棵n叉树,如下图所示。
在 这个n叉树里面,用递归来控制树的深度,而for循环来控制树的宽度,即使用递归来纵向控制,for循环横向控制。因为我们所求的是组合即[1,2]和[2,1]是为同一个组合所以此时我们需要设置一个startindex来控制只取大于当前的值来构成组合,这样就能避免出现重复的组合。
代码实现:
class Solution {
private:
vector<vector<int>>result;
vector<int>path;
void backtracing(int n ,int k ,int startindex){
if(path.size() == k){
result.push_back(path);
return;
}
for(int i = startindex;i <= n; i++){
path.push_back(i);
backtracing(n, k, i+1);
path.pop_back();
}
}
public:
vector<vector<int>> combine(int n, int k) {
result.clear();
path.clear();
backtracing(n,k,1);
return result;
}
};