1. 程式人生 > 其它 >[LeetCode] #39 組合總和

[LeetCode] #39 組合總和

[LeetCode] #39 組合總和

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

candidates 中的數字可以無限制重複被選取。如果至少一個所選數字數量不同,則兩種組合是唯一的。

對於給定的輸入,保證和為 target 的唯一組合數少於 150 個。

輸入: candidates = [2,3,5], target = 8

輸出: [[2,2,2,2],[2,3,3],[3,5]]

要求我們找滿足條件的組合,可以使用回溯演算法

類似於[LeetCode] #17 電話號碼的字母組合

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); } } }

知識點:

總結:

走不通就退一步的列舉法就叫回朔法

尋找組合的問題可以使用回溯演算法