1 class Solution { 2 public List<List<Integer>> combinationSum2(int[] candidates, int target) { 3 List<List<Integer>> combinations = new ArrayList<>(); 4 Arrays.sort(candidates); 5 List<Integer> tempCombination = new ArrayList<>(); 6 backtracking(tempCombination, combinations, new boolean[candidates.length], 0, target, candidates); 7 return combinations; 8 } 9 10 private void backtracking(List<Integer> tempCombination, List<List<Integer>> combinations, 11 boolean[] hasVisited, int start, int target, final int[] candidates) { 12 13 if (target == 0) { 14 combinations.add(new ArrayList<>(tempCombination)); 15 return; 16 } 17 for (int i = start; i < candidates.length; i++) { 18 if (i != 0 && candidates[i] == candidates[i - 1] && !hasVisited[i - 1]) { 19 continue; 20 } 21 if (candidates[i] <= target) { 22 tempCombination.add(candidates[i]); 23 hasVisited[i] = true; 24 backtracking(tempCombination, combinations, hasVisited, i + 1, target - candidates[i], candidates); 25 hasVisited[i] = false; 26 tempCombination.remove(tempCombination.size() - 1); 27 } 28 } 29 } 30 }
对比leetcode39:
1 public class LEET_39 { 2 public List<List<Integer>> combinationSum(int[] candidates, int target) { 3 List<List<Integer>> combinations = new ArrayList<>(); 4 List<Integer> tempCombination = new ArrayList<>(); 5 backtracking(tempCombination, combinations, 0, target, candidates); 6 return combinations; 7 } 8 9 private void backtracking(List<Integer> tempCombination, List<List<Integer>> combinations, 10 int start, int target, final int[] candidates) { 11 12 if (target == 0) { 13 combinations.add(new ArrayList<>(tempCombination)); 14 return; 15 } 16 for (int i = start; i < candidates.length; i++) { 17 if (candidates[i] <= target) { 18 tempCombination.add(candidates[i]); 19 backtracking(tempCombination, combinations, i, target - candidates[i], candidates); 20 tempCombination.remove(tempCombination.size() - 1); 21 } 22 } 23 } 24 }