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.
Example 1:
Input: k = 3, n = 7
Output:
[[1,2,4]]
Example 2:
Input: k = 3, n = 9
Output:
[[1,2,6], [1,3,5], [2,3,4]]
分析: n是k个不同的个位数之和,即1~9每个数字有2种选择,选或不选(两种递归) 。 采用深度搜索,如果不选该数即继续往下递归,如果选了该数,n减掉该数,k减1,继续往下递归。
C++代码如下:
class Solution {
public:
vector<vector<int>> combinationSum3(int k, int n) {
vector<int> p;
vector<vector<int>> ans;
DFS(k, n, 1, p, ans);
return ans;
}
void DFS(int k, int n, int cur, vector<int>& p, vector<vector<int>>& ans) {
if (k==0) {
if (n == 0) ans.push_back(p);//p满足加入答案
return;
}
if (cur > 9) return; //此处不能放在k==0之前,如果放在k==0之前当答案含有9的时候会跳过该答案直接返回
DFS(k, n, cur+1, p, ans); //不选cur
p.push_back(cur); //选择cur
DFS(k-1, n-cur,cur+1, p, ans);
p.pop_back(); //深搜完把cur pop掉
}
};