题目链接:力扣https://leetcode-cn.com/problems/combinations/
题意:
给定两个整数
n
和k
,返回范围[1, n]
中所有可能的k
个数的组合。你可以按 任何顺序 返回答案。
方法: 递归嵌套
class Solution {
private:
vector<vector<int>> res;
int k,n;
void find(int index,int loc,vector<int>& vct)//index表示第几层,loc表示当前要从哪个位置开始
{
if(index==k)//边界条件,达到第k层
{
res.emplace_back(vct);//插入返回向量
return ;//直接返回
}
if(loc==n&&index<k) return ;//边界条件:层数还未达到,但是下标已经到了,就返回
for(int i=loc+1;i<=n;i++)//从loc的下一个位置开始枚举到n
{
vct.emplace_back(i);//向量末尾放入i
find(index+1,i,vct);//递归
vct.pop_back();//删除尾部元素
}
}
public:
vector<vector<int>> combine(int n, int k) {
this->k = k;
this->n = n;
vector<int> vct;
find(0,0,vct);//初始状态查找
return res;
}
};
剪枝优化:
class Solution {
private:
vector<vector<int>> res;
int k,n;
void find(int index,int loc,vector<int>& vct)//index表示第几层,loc表示当前要从哪个位置开始
{
if(index==k)//边界条件,达到第k层
{
res.emplace_back(vct);//插入返回向量
return ;//直接返回
}
if(loc==n&&index<k) return ;//边界条件:层数还未达到,但是下标已经到了,就返回
for(int i=loc+1;i<=n-(k-vct.size())+1;i++)//从loc的下一个位置开始枚举到n-(k-vct.size())+1,用于剪枝
{
vct.emplace_back(i);//向量末尾放入i
find(index+1,i,vct);//递归
vct.pop_back();//删除尾部元素
}
}
public:
vector<vector<int>> combine(int n, int k) {
this->k = k;
this->n = n;
vector<int> vct;
find(0,0,vct);//初始状态查找
return res;
}
};