Problem Description:
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]]
Analysis:
本题使用dfs的深度遍历算法依次去遍历1~9所有的数字,找到满足和位n的k个数字,并进行相应的剪枝。代码如下:
Code:
class Solution {
int k;
List<List<Integer>> res = new ArrayList<>();
public List<List<Integer>> combinationSum3(int k, int n) {
this.k = k;
dfs(k, n, 1, new ArrayList<Integer>());
return res;
}
public void dfs(int ans, int n, int num, ArrayList<Integer> temp) {
if(n < 0) {
return;
}
if(ans == 0 && n == 0) {
ArrayList<Integer> cl = (ArrayList<Integer>)temp.clone();
res.add(cl);
return;
}
for(int i = num; i < 10; i++) {
if(n >= i) {
temp.add(i);
dfs(ans - 1, n - i, i + 1, temp);
temp.remove(temp.size() - 1);
}
}
}
}