77.组合
题目链接:77组合
题目描述:
给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。
你可以按 任何顺序 返回答案。
解题思路:
- 首先记住回溯的三部曲,跟递归类似
(1)确定递归函数的返回值和参数
(2)确定终止条件
(3)确定单层逻辑 - 可以将回溯和二叉树联系起来,直接在二叉树的题目中,我们也运用到了回溯的思想,因此,便于好理解,我们可以直接将题目想象成树的样子。在回溯中,集合的大小就是树的宽度,通常,采用循环的方式将集合中的所有数字进行遍历;同时,递归的深度就是树的深度。
- 为了好理解。本题中的整数n就是集合,比如n=4,则集合为1到4,共有四个数字,递归的深度是k,即,树的深度是2
。
class Solution {
public:
vector<vector<int>> result;
vector<int>path;
vector<vector<int>> combine(int n, int k) {
trackbacking(n,k,1);
return result;
}
void trackbacking(int n,int k,int startIndex)
{
if(path.size()==k) //确定终止条件,即是树中的叶子节点,一般情况下,是满足条件或者到底了。
{ //在本题中,即path的大小满足了k,所以,此时便可以直接返回了
result.push_back(path);
return ;
}
for(int i=startIndex;i<=n;i++) //横向,树的宽度
{
path.push_back(i);
trackbacking(n,k,i+1);
path.pop_back();
}
}
};