leetcode:組合總和II(回溯java)
阿新 • • 發佈:2018-12-13
package LeetCode; import java.util.*; /* 給定一個數組 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] ] */ public class CombinationSum2 { public List<List<Integer>> combinationSum2(int[] candidates, int target) { List<List<Integer>> results=new ArrayList<>(); List<Integer> result=new ArrayList<>(); Arrays.sort(candidates); Set<List<Integer>> juge=new HashSet<>(); combinationsum3(results,juge,result,-1,target,candidates); return results; } public void combinationsum3(List<List<Integer>> results, Set<List<Integer>> juge, List<Integer> result, int start, int target, int[] candidates) { if (target == 0) { if (!juge.contains(new ArrayList<Integer>(result))) { juge.add(new ArrayList<Integer>(result)); results.add(new ArrayList<Integer>(result)); } return; } if (target < 0) { return; } else { for (int i = start + 1; i < candidates.length; i++) { result.add(candidates[i]); combinationsum3(results,juge, result, i, target-candidates[i], candidates); result.remove(result.size() - 1); } } } /* public List<List<Integer>> combinationSum2(int[] candidates, int target) { List<List<Integer>> result = new ArrayList<>(); Arrays.sort(candidates); help(candidates,target,0,new ArrayList<Integer>(),result); return result; } public void help(int[] candidates, int target,int index,List<Integer> list,List<List<Integer>> result){ if(target >0){ for(int i = index; i< candidates.length&&target>=candidates[index];i++){ list.add(candidates[i]); help(candidates,target-candidates[i],i+1,list,result); //已經退出來說明此數candidates[i]數不合適所以與它相同的數肯定也不合適 while(i<= candidates.length-2 &&candidates[i]==candidates[i+1]){ i++; } list.remove(list.size()-1); } }else if(target == 0){ result.add(new ArrayList<Integer>(list)); } }*/ public static void main(String[] args) { CombinationSum2 a=new CombinationSum2(); int[]b={10,1,2,7,6,1,5 }; System.out.println( a.combinationSum2(b,8)); } }