Combination Sum Series
Combination Sum I: http://blog.csdn.net/Arcome/article/details/53888879
Combination Sum II:
Combination Sum III: http://blog.csdn.net/Arcome/article/details/53758448
Find all possible combinations of k numbers that add up to a number n,
given that only numbers from 1 to 9 can be used and each combination should be a unique set of numbers.
Input: k = 3, n = 7
Output:[[1,2,4]]
Input: k = 3, n = 9
Output:[[1,2,6], [1,3,5], [2,3,4]]
整理一下题意:给定整数k和整数n,其中k属于[1,9]。找到一种含有k个数的组合,且这k个数加起来等于n。要求返回所有满足这样的组合。
采用DFS思路。对于每个数,加入到序列中,通过dfs遍历每一种情况。若序列恰好满足(k,n)的条件,则加入到结果序列中。重复DFS过程直到遍历完所有数字。
注意,代码中函数dfs(int k, int n, int level, vector &out, vector
//DFS版本,用时0ms
class Solution {
public:
vector<vector<int>> combinationSum3(int k, int n) {
vector<vector<int>> res;
vector<int> out;
dfs(k,n,1,out,res);
return res;
}
void dfs(int k, int n, int level, vector<int> &out, vector<vector<int>> &res)
{
if(n<0) return;
if(n==0&&out.size()==k){res.push_back(out);}
for(int i=level;i<=9;i++){
out.push_back(i);
dfs(k,n-i,i+1,out,res);
out.pop_back();
}
}
};
参考Combination Sum I,II的框架重写代码,思路会更清晰。与Combination Sum I,II相比,生成函数中修改的地方有:
代码如下。
//DFS版本,用时3ms
class Solution {
public:
vector<vector<int>> combinationSum3(int k, int n) {
vector<int> temp;
vector<vector<int>> result;
generate(temp,result,k,n,1);
return result;
}
void generate(vector<int> temp,vector<vector<int>>&result,int k,int target,int index){
if(target==0&&k==0){
result.push_back(temp);
return;
}
for(int i=index;i<=9;i++){
if(target>=i&&k>0){
temp.push_back(i);
generate(temp,result,k-1,target-i,i+1);
temp.pop_back();
}
}
}
};