题目

image.png

思路

image.png
图中将used的变化⽤橘⻩⾊标注上,可以看出在candidates[i] == candidates[i - 1]相同的情况下:

  • used[i - 1] == true,说明同⼀树⽀candidates[i - 1]使⽤过
  • used[i - 1] == false,说明同⼀树层candidates[i - 1]使⽤过

    代码

    ```java class Solution {

    List< List > result = new ArrayList<>();

    LinkedList path = new LinkedList<>();

  1. public List<List<Integer>> combinationSum2(int[] candidates, int target) {
  2. boolean[] used = new boolean[candidates.length];
  3. //剪枝排序
  4. Arrays.sort(candidates);
  5. backtracking(candidates,target,0,0,used);
  6. return result;
  7. }
  8. public void backtracking(int[] candidates, int target, int sum, int startIndex, boolean[] used) {
  9. if(sum > target) {
  10. return ;
  11. }
  12. if(sum == target) {
  13. result.add(new ArrayList(path) );
  14. return ;
  15. }
  16. for(int i = startIndex ; i < candidates.length && sum + candidates[i] <= target; i++ ) {
  17. if(i > 0 && candidates[i] == candidates[i-1] && used[i - 1] == false ) {
  18. continue;
  19. }
  20. if(sum == target) {
  21. result.add(path);
  22. return ;
  23. }
  24. used[i] = true;
  25. sum += candidates[i];
  26. path.add(candidates[i]);
  27. backtracking(candidates,target,sum,i+1,used);
  28. path.removeLast();
  29. used[i] = false;
  30. sum -= candidates[i];
  31. }
  32. }

} ```