题目描述
找出所有相加之和为 n 的 k 个数的组合,且满足下列条件:只使用数字1到9。每个数字 最多使用一次。返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次,组合可以以任何顺序返回。
解析
递归加剪枝,搜索长度达到k就可以返回,另外当选择的数之和比n还大的时候就可以不用再搜索了。
public List<List<Integer>> combinationSum3(int k, int n) {List<List<Integer>> res = new ArrayList<>();boolean[] isChosen = new boolean[10];List<Integer> current = new ArrayList<>();DFS(res, current, isChosen, 0, k, n, 1);return res;}private void DFS(List<List<Integer>> res,List<Integer> current,boolean[] isChosen,int curSum,int k,int n,int start) {if(current.size() == k) {if(curSum == n) {res.add(new ArrayList<>(current));}return;}for(int i = start; i <= 9 ; i++) {if(!isChosen[i]) {current.add(i);curSum += i;if(curSum <= n) {isChosen[i] = true;DFS(res, current, isChosen, curSum, k, n, i + 1);}current.remove(current.size() - 1);curSum -= i;isChosen[i] = false; // 回溯}}}