LeetCode-039-組合總和
阿新 • • 發佈:2021-10-18
組合總和
題目描述:給定一個無重複元素的陣列 candidates 和一個目標數 target ,找出 candidates 中所有可以使數字和為 target 的組合。
candidates 中的數字可以無限制重複被選取。
說明:
所有數字(包括 target)都是正整數。
解集不能包含重複的組合。
示例說明請見LeetCode官網。
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/combination-sum/
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。
解法一:窮舉法
類似構造一棵多叉樹,最大深度為candidates陣列的長度,然後獲取所有可能的路徑,最大路徑是由根節點到葉子節點,判斷所有的路徑之和是否等於target,如果相等,則加到結果集中,最後需要判重,把重複的組合去掉,最後返回。
import java.util.*; public class LeetCode_039 { /** * 窮舉法 * * @param candidates * @param target * @return */ public static List<List<Integer>> combinationSum(int[] candidates, int target) { // 結果集 List<List<Integer>> result = new ArrayList<>(); // 所有可能的組合情況 Queue<List<Integer>> allPossibleCombinations = new LinkedList<>(); // 初始化所有的情況 for (int candidate : candidates) { List<Integer> onePossibleCombination = new ArrayList<>(); onePossibleCombination.add(candidate); allPossibleCombinations.add(onePossibleCombination); } while (!allPossibleCombinations.isEmpty()) { List<Integer> temp = allPossibleCombinations.poll(); int sum = 0; for (Integer num : temp) { sum += num; } if (sum == target) { result.add(temp); } else if (sum < target) { for (int candidate : candidates) { // List複製方法 List<Integer> toAdd = new ArrayList<>(Arrays.asList(new Integer[temp.size()])); Collections.copy(toAdd, temp); toAdd.add(candidate); allPossibleCombinations.add(toAdd); } } } // 去重後的結果 List<List<Integer>> result1 = new ArrayList<>(); for (int i = 0; i < result.size(); i++) { boolean isRepeated = false; List<Integer> one = result.get(i); Collections.sort(one); for (int j = i + 1; j < result.size(); j++) { List<Integer> two = result.get(j); Collections.sort(two); if (one.size() != two.size()) { continue; } boolean equals = true; for (int x = 0; x < one.size(); x++) { if (!one.get(x).equals(two.get(x))) { equals = false; continue; } } if (equals) { isRepeated = true; } } if (!isRepeated) { result1.add(one); } } return result1; } public static void main(String[] args) { int[] candidates = new int[]{8, 10, 6, 3, 4, 12, 11, 5, 9}; for (List<Integer> integers : combinationSum(candidates, 28)) { for (Integer integer : integers) { System.out.print(integer + " "); } System.out.println(); } } }
【每日寄語】 不要急著讓生活給予所有的答案,有時我們需要耐心的等待。相信過程,坦然前行,不負生活,生活也必不負你。