[LeetCode] #39 組合總和
阿新 • • 發佈:2021-10-14
[LeetCode] #39 組合總和
給定一個無重複元素的正整數陣列 candidates 和一個正整數 target ,找出 candidates 中所有可以使數字和為目標數 target 的唯一組合。
candidates 中的數字可以無限制重複被選取。如果至少一個所選數字數量不同,則兩種組合是唯一的。
對於給定的輸入,保證和為 target 的唯一組合數少於 150 個。
輸入: candidates = [2,3,5],
target = 8
輸出: [[2,2,2,2],[2,3,3],[3,5]]
要求我們找滿足條件的組合,可以使用回溯演算法
class Solution {public List<List<Integer>> combinationSum(int[] candidates, int target) { List<List<Integer>> ans = new ArrayList<List<Integer>>(); List<Integer> combine = new ArrayList<Integer>(); dfs(candidates, target, ans, combine, 0);return ans; } public void dfs(int[] candidates, int target, List<List<Integer>> ans, List<Integer> combine, int idx) { if (idx == candidates.length) { return; } if (target == 0) { ans.add(new ArrayList<Integer>(combine));return; } dfs(candidates, target, ans, combine, idx + 1); if (target - candidates[idx] >= 0) { combine.add(candidates[idx]); dfs(candidates, target - candidates[idx], ans, combine, idx); combine.remove(combine.size() - 1); } } }
知識點:無
總結:
走不通就退一步的列舉法就叫回朔法
尋找組合的問題可以使用回溯演算法