1. 程式人生 > >Leetcode 39.組合總數

Leetcode 39.組合總數

組合總數

給定一個無重複元素的陣列 candidates 和一個目標數 target ,找出 candidates 中所有可以使數字和為 target 的組合。

candidates 中的數字可以無限制重複被選取。

說明:

  • 所有數字(包括 target)都是正整數。
  • 解集不能包含重複的組合。 

示例 1:

輸入: candidates = [2,3,6,7], target = 7,

所求解集為:

[

[7],

[2,2,3]

]

 

 

解題思路:

我個人感覺該題目一點也不難,其實也是一個遞迴的過程,當達到遞迴條件時,就將結果加入結果集;

首先題目沒說給的陣列有啥特性,因此我先將陣列進行了排序,這樣在某個點找不著結果,那後面的都比target大,自然也就沒有結果了。廢話不多說,直接看程式碼;

程式碼如下:

 

 1 import java.util.*;
 2 public class Solution {
 3     public List<List<Integer>> combinationSum(int[] candidates, int
target) { 4 List<List<Integer>> LList = new ArrayList<List<Integer>>(); // 最終的結果集 5 if(candidates == null || candidates.length < 1 || target < 1 ) 6 return LList; 7 Arrays.sort(candidates); // 排序,使得不用對相同的結果集計算多次 8 List<Integer> list = new
ArrayList<Integer>(); // 臨時結果儲存 9 combinationSumCore(candidates,list, target, 0, LList); // 核心函式 10 return LList; 11 } 12 public void combinationSumCore(int[] candidates,List<Integer> list, int target, int index, List<List<Integer>> LList) 13 { 14 for(int i = index; i < candidates.length; i++) 15 { 16 if(candidates[i] == target) // 等於,就加入結果集 17 { 18 List<Integer> result = new ArrayList<Integer>(); 19 result.addAll(list); 20 result.add(candidates[i]); 21 LList.add(result); 22 } 23 else if(candidates[i] < target) // 小於,就繼續遞迴 24 { 25 List<Integer> result = new ArrayList<Integer>(); 26 result.addAll(list); 27 result.add(candidates[i]); 28 combinationSumCore(candidates, result, target - candidates[i], i, LList); // 這邊i值不變,是因為當前值可以使用多次 29 } 30 else // 大於,則後面的數字都大於,因此不可能出現在結果集中 31 { 32 break; 33 } 34 } 35 } 36 }