题目链接:力扣
题意:
找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。
说明:
所有数字都是正整数。
解集不能包含重复的组合。
方法: 回溯枚举
class Solution {
private:
int k,n;//将k和n由局部变为全局
vector<vector<int>> res;//结果向量
vector<int> vct;//暂存向量
void find(int loc,int sum)//loc表示vct的最后一个元素在1-9哪个位置,sum表示当前的累加和
{
int index = vct.size();//获取向量长度
if(index==k&&sum==n)//边界条件,满k个数,并且累加和等于n
{
res.emplace_back(vct);
return ;
}
if(index<k&&loc==9) return ;//loc提前到n就放弃
for(int i=loc+1;i<=9;i++)
{
vct.emplace_back(i);
sum += i;
find(i,sum);
vct.pop_back();
sum -= i;
}
}
public:
vector<vector<int>> combinationSum3(int k, int n) {
if(n>45||k>9) return res;
this->k = k;
this->n = n;
find(0,0);
return res;
}
};
剪枝:判断累加和是否超过n,循环的时候减少枚举最后几个元素,留下空位
class Solution {
private:
int k,n;//将k和n由局部变为全局
vector<vector<int>> res;//结果向量
vector<int> vct;//暂存向量
void find(int loc,int sum)//loc表示vct的最后一个元素在1-9哪个位置,sum表示当前的累加和
{
int index = vct.size();//获取向量长度
if(sum>n) return ;//剪枝优化,累加和超过n就退出
if(index==k&&sum==n)//边界条件,满k个数,并且累加和等于n
{
res.emplace_back(vct);
return ;
}
if(index<k&&loc==9) return ;//loc提前到n就放弃
for(int i=loc+1;i<=9-(k-index)+1;i++)
{
vct.emplace_back(i);
sum += i;
find(i,sum);
vct.pop_back();
sum -= i;
}
}
public:
vector<vector<int>> combinationSum3(int k, int n) {
if(n>45||k>9) return res;
this->k = k;
this->n = n;
find(0,0);
return res;
}
};