组合总和 III
组合总和 III
问题描述
找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。
说明:
所有数字都是正整数。
解集不能包含重复的组合。
示例 1:
输入: k = 3, n = 7
输出: [[1,2,4]]
示例 2:
输入: k = 3, n = 9
输出: [[1,2,6], [1,3,5], [2,3,4]]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/combination-sum-iii
思路
这个题比较简单,用到的是回溯算法。
要解决的问题是在1~9之间选择k个数字,使得他们的和为n。每次选择的数字是1~9,因为不能重复,所以每次递归从上一次的位置加1开始,将每次递归的结果存到一个tmp数组里面,当tmp的size到k时,判断他们的和是否为n,如果为n,将tmp插入到ret,不管sum是否等于n,都要返回到上一层。返回到上一层后,千万别忘记,将sum减i,并且在tmp中弹出i;
题解
class Solution {
public:
vector<int> tmp;
vector<vector<int>> ret;
vector<vector<int>> combinationSum3(int k, int n) {
dfs(k,n,0,1);
return ret;
}
void dfs(int k,int n,int sum,int location){
if(tmp.size()==k){
if(sum==n){
ret.push_back(tmp);
}
return;
}
for(int i=location;i<=9;i++){
tmp.push_back(i);
sum=sum+i;
dfs(k,n,sum,i+1);
sum=sum-i;
tmp.pop_back();
}
}
};