組合總和 III(力扣第216題)
阿新 • • 發佈:2020-07-19
題目:
找出所有相加之和為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); } }