找出所有相加之和为 n
的 k
个数的组合,且满足下列条件:
- 只使用数字1到9
- 每个数字 最多使用一次
返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次,组合可以以任何顺序返回。
List<List<Integer>> res = new ArrayList<>();
List<Integer> list = new ArrayList<>();
public List<List<Integer>> combinationSum(int k, int n){
backtrace(k, n, 1);
return res;
}
// start用来记录当前list添加到哪一位了
public void backtrace(int k, int n, int start){
if(list.size() == k){
if(sum(list) == n && !res.contains(list)) res.add(new ArrayList(list));
return;
}
for(int i = start; i <= 9; i++){
list.add(i);
backtrace(k, n, i+1);
list.remove(list.size()-1);
}
}
public int sum(List<Integer> list){
int sum = 0;
for(int i : list){
sum += i;
}
return sum;
}
方法二:
使用mask二进制表示1~9中哪些数字被使用,再进行判断