题目
找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。
说明:
所有数字(包括 target)都是正整数。
解集不能包含重复的组合。
示例1
输入:
k = 3, n = 7
输出:
[[1,2,4]]
示例2
输入:
k = 3, n = 9
输出:
[[1,2,6], [1,3,5], [2,3,4]]
解法
- 与77.组合总和和40.组合总和II类似
- 回溯跳出的条件: 解中的大小等于target
- 回溯放入的数字:后面的大于等于前面的,用now_id存储下标,从now_id开始遍历
- 注意剪枝 当现有元素+后面可以取的元素 < 要求的个数 直接返回
代码
#include <stdio.h>
#include <iostream>
#include <vector>
using namespace std;
class Solution {
public:
vector<vector<int>> ans;
vector<int> tmp;
vector<vector<int>> combinationSum3(int k, int target) {
dfs(0,target,0,k);
return ans;
}
void dfs(int now_id,int target,int now_sum,int k){
if(now_id > 9|| now_sum > target ||tmp.size() > k || tmp.size() + (9-now_id+1) < k){return;}
if(now_sum==target && tmp.size()==k){
ans.push_back(tmp);
return ;
}
for(int i=now_id;i<9;i++){
tmp.push_back(i+1);
dfs(i+1,target,now_sum+i+1,k);
tmp.pop_back();
}
}
};
int main()
{
int k = 3;
int target = 9;
Solution s;
vector<vector<int>> ans = s.combinationSum3(k, target);
for(int i=0;i<ans.size();i++){
for(int j=0;j<ans[i].size();j++){
if(j!=0) cout<<",";
cout<<ans[i][j];
}
cout<<endl;
}
return 0;
}
今天也是爱zz的一天哦!