组合总和 III(力扣第216题)
题目:
找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。
说明:
所有数字都是正整数。
解集不能包含重复的组合。
示例:
输入: k = 3, n = 7 输出: [[1,2,4]]
分析:
明确题目的限制条件:1、组合中只允许存在1-9的数字;2、组合中元素的个数是k个;3、k个1-9范围内的数相加之和为n;4、组合中的元素不允许重复
可见,限制条件有很多,还是采用DFS和回溯的方法求解,只不过现在DFS的搜索路径长度有了固定的长度,也就是k,并且搜索过程中,每个节点的值只能是1-9的数。不能重复可以通过将下一次搜索的节点值设置为当前搜索节点值加1,这样就保证了不会产生重复得数字。在搜索的过程中,一旦搜索路径达到了规定长度并且此时路径上的节点值之和并不是n那么就立刻返回。
总之,整体的思路,和组合一、二差不多,只不过加一些条件即可。
具体的代码实现如下:
private List<List<Integer>> reslist; public List<List<Integer>> combinationSum3(int k, int n) { if (k > n){ return new ArrayList<>(); } reslist = new ArrayList<>(); List<Integer> curlist = new ArrayList<>(); combinationCur(k,1,n,curlist); return reslist; } private void combinationCur(int k, int s,int n, List<Integer> curlist) { if (curlist.size() == k && n != 0){ return; } if (n == 0){ if (curlist.size() == k){ reslist.add(new ArrayList<>(curlist)); } return; } for (int i = s; i <= 9; i++) { curlist.add(i); combinationCur(k,i+1,n-i,curlist); curlist.remove(curlist.size()-1); } }