LeetCode-40.组合综合II

给定一个数组,candidates和一个目标数target, 找出candidates中的每个数字,在每个组合中只能使用一次。

说明

1.所有数字(包括目标数)都是正整数。
2.解集不能包含重复的组合。

示例1:
输入:cadidates = [10 1 2 7 6 1 5],target = 8
所求的解集是:
[[1,7],[1,2,5],[2,6],[1,1,6]]

示例2:
输入:cadidates = [2 5 2 1 2], target = 5
所求解集是:[1,2,2],[5]
解题思路
穷举类问题想到回溯法。
1)排序,我们先看看一下排序的效果
如cadidates = [10,1,2,7,6,1,5],target = 8
排序后cadidates = [1,1,2,5,6,7,10] ,假设做到1 + 1 + 2,下一步+5已经大于5了,因此这种情况后的所有组合都可以跳过不做,如果不排序是达不到这个效果的。
2)去重的问题,另一个思路是用一个HashSet ,每次判断set是否已经包含即将添加的list.
代码:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
public class CombinationSum_1 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入数组个数: ");
        int n = scanner.nextInt();
        System.out.println("请输入数组: ");
        int [] num = new int[n];
        for (int i = 0; i < num.length; i++) {
            num[i] = scanner.nextInt();
        }
        System.out.println("请输入目标数: ");
        int target = scanner.nextInt();
        List<List<Integer>> lists = new CombinationSum_1().combinationSum2(num,target);
        System.out.println(lists);
    }
      List<List<Integer>> lists = new ArrayList<>();
    public   List<List<Integer>> combinationSum2(int[] candidates, int target) {
        if (candidates == null || candidates.length == 0) {
            return  null;
        }
        Arrays.sort(candidates);
        findList(candidates,target,0,0,new ArrayList<>());
        return lists;
    }
    public  void findList(int[] candidate,int target,int sum,int index,List<Integer> list){
      if (sum == target){
          lists.add(new ArrayList<>(list));
          return;
      }else {
            for (int i = index; i < candidate.length ; i++) {
                if (i > index && candidate[i] == candidate[i - 1]) continue;
                if (sum + candidate[i] <= target){
                    list.add(candidate[i]);
                    findList(candidate,target,sum+candidate[i],i+1,list);
                    list.remove(list.size() - 1);
                }
            }
        }
    }
}

你可能感兴趣的:(Java)