LeetCode 組合總和 II 重點整理回溯法
阿新 • • 發佈:2018-12-12
給定一個數組 candidates
和一個目標數 target
,找出 candidates
中所有可以使數字和為 target
的組合。
candidates
中的每個數字在每個組合中只能使用一次。
說明:
- 所有數字(包括目標數)都是正整數。
- 解集不能包含重複的組合。
示例 1:
輸入: candidates =[10,1,2,7,6,1,5]
, target =8
, 所求解集為: [ [1, 7], [1, 2, 5], [2, 6], [1, 1, 6] ]
示例 2:
輸入: candidates = [2,5,2,1,2], target = 5, 所求解集為:[ [1,2,2], [5] ]
class Solution { public List<List<Integer>> combinationSum2(int[] candidates, int target) { ArrayList<List<Integer>> res=new ArrayList<>(); if(candidates.length==0) return res; // 先排序 Arrays.sort(candidates); if(candidates[0]>target) return res; List<Integer> temp=new ArrayList<>(); find(candidates,target,res,temp,0); return res; } public boolean find(int[] candidates, int target,List<List<Integer>> res,List<Integer> temp,int start){ // 遞迴出口 if(target<0) return false; else if(target==0){ res.add(new ArrayList<Integer>(temp)); return true; } else{ for(int i=start;i<candidates.length;i++){ // 去重 只有當target==0時,i才會加加 因此可通過i>start 判斷已有一次得到結果 通過candidates[i]==candidates[i-1]去重 if(i>start && candidates[i]==candidates[i-1]) continue; temp.add(candidates[i]); // 遞迴 boolean b=find(candidates,target-candidates[i],res,temp,i+1); // 回溯 temp.remove(temp.size()-1); if(!b) break; } } return true; } }