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.
Note:
- All numbers will be positive integers.
- The solution set must not contain duplicate combinations.
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]]
这种combination sum的做法本质都没有任何不同,就是递归backtrace。就是根据当前的条件制定往下递归的下一层的数字。偶尔注意一下去除重复即可。
这一题给定的范围就是1~9。排重的方法就是每一层都不会走之前递归层重复的数字,换一句话说就是下一个递归层的数字必然要比上几层的大。同时,层数是固定为k的,所以终结条件就是走到第k层。然后判断和是否为target即可。
给出代码如下:
public List<List<Integer>> combinationSum3(int k, int n) {
List<List<Integer>> res = new LinkedList<List<Integer>>();
doCombine(k, n, 0, res, new LinkedList<Integer>());
return res;
}
public void doCombine(int k, int n, int prevVal, List<List<Integer>> res, LinkedList<Integer> curRes) {
if (curRes.size() == k) {
if (n == 0) {
res.add(new LinkedList<Integer>(curRes));
}
} else {
for (int i = prevVal + 1; i <= Math.min(n, 9); i++) {
curRes.add(i);
doCombine(k, n - i, i, res, curRes);
curRes.removeLast();
}
}
}
注意一下curRes的先加后去尾是为了dfs里面节约空间的一种做法。这样空间复杂度就是最大为k了。