思路:
DFS。
java code:一开始写的,很烂。
public class Solution {
void dfs(List<List<Integer>> res, Set set, int sum, int count, int k, int n, List<Integer> list, int start) {
if(count == k && sum < n) return;
if(count < k && sum >= n) return;
if(count == k && sum == n) {
List<Integer> copyList = new ArrayList<Integer>(list);
res.add(copyList);
return;
}
for(int i = start; i <= 9; ++i) {
if(sum + i <= n && !set.contains(i)) {
sum += i;
set.add(i);
list.add(i);
dfs(res, set, sum, count + 1, k, n, list, i + 1);
sum -= i;
set.remove(i);
list.remove(list.size() - 1);
}
}
}
public List<List<Integer>> combinationSum3(int k, int n) {
Set set = new HashSet();
List<List<Integer>> res = new ArrayList<List<Integer>>();
List<Integer> list = new ArrayList<Integer>();
int sum = 0, count = 0;
dfs(res, set, sum, count, k, n, list, 1);
return res;
}
}
精简,改写:
public class Solution {
void dfs(List<List<Integer>> res, int k, int n, List<Integer> list, int start) {
if(list.size() == k && n > 0) return;
if(list.size() < k && n <= 0) return;
if(list.size() == k && n == 0) {
List<Integer> copyList = new ArrayList<Integer>(list);
res.add(copyList);
return;
}
for(int i = start; i <= 9; ++i) {
if(n - i >= 0) {
list.add(i);
dfs(res, k, n - i, list, i + 1);
list.remove(list.size() - 1);
}
}
}
public List<List<Integer>> combinationSum3(int k, int n) {
List<List<Integer>> res = new ArrayList<List<Integer>>();
List<Integer> list = new ArrayList<Integer>();
dfs(res, k, n, list, 1);
return res;
}
}