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]]
Credits:
Special thanks to @mithmatt for adding this problem and creating all test cases.
public class Solution {
public List<List<Integer>> combinationSum3(int k, int n) {
List<List<Integer>> res = new ArrayList<List<Integer>>();
if (k < 1) {
return res;
}
if (k == 1) {
if (n >= 0 && n <= 9) {
List<Integer> tempList = new ArrayList<Integer>();
tempList.add(n);
res.add(tempList);
}
}
if (k > 1) {
backtrack(res, new ArrayList<Integer>(), 1, k, n);
}
return res;
}
public void backtrack(List<List<Integer>> list, List<Integer> tempList, int start, int k, int n) {
if (k == 2) {
int left = start, right = 9;
while (left < right) {
if (left + right == n) {
tempList.add(left);
tempList.add(right);
list.add(new ArrayList<Integer>(tempList));
tempList.remove(tempList.size() - 1);
tempList.remove(tempList.size() - 1);
left ++;
right --;
} else if (left + right < n) {
left ++;
} else {
right --;
}
}
}
for (int i = start; i <= 9; i ++) {
tempList.add(i);
backtrack(list, tempList, i + 1, k - 1, n - i);
tempList.remove(tempList.size() - 1);
}
}
}
当然代码也可以简洁一些,代码如下:
public List<List<Integer>> combinationSum3(int k, int n) {
List<List<Integer>> ans = new ArrayList<>();
combination(ans, new ArrayList<Integer>(), k, 1, n);
return ans;
}
private static void combination(List<List<Integer>> ans, List<Integer> comb, int k, int start, int n) {
if (comb.size() > k) {
return;
}
if (comb.size() == k && n == 0) {
List<Integer> li = new ArrayList<Integer>(comb);
ans.add(li);
return;
}
for (int i = start; i<=9; i++) {
if (n-i >= 0) {
comb.add(i);
combination(ans, comb, k, i+1, n-i);
comb.remove(comb.size() - 1);
}
}
}