1. 程式人生 > 實用技巧 >組合總和 III(力扣第216題)

組合總和 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); } }