Loading...

给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。

candidates 中的每个数字在每个组合中只能使用 一次 。

注意:解集不能包含重复的组合。

示例 1:

输入: candidates = [10,1,2,7,6,1,5], target = 8,
输出:
[
[1,1,6],
[1,2,5],
[1,7],
[2,6]
]

示例 2:

输入: candidates = [2,5,2,1,2], target = 5,
输出:
[
[1,2,2],
[5]
]

题解一

public List<List<Integer>> combinationSum2(int[] candidates, int target) {
    // 排序
    Arrays.sort(candidates);
    List<List<Integer>> result = new ArrayList<>();
    recursion(candidates, target, new ArrayList<>(), result, 0);
    return result;
}
public void recursion(int[] candidates, int target, List<Integer> list, List<List<Integer>> result, int start){
    // 去重
    if (target == 0 && !result.contains(list)){
        result.add(new ArrayList<>(list));
        return;
    }
    for (int i = start; i < candidates.length; i++){
        if (candidates[i] > target){
            return;
        }
        list.add(candidates[i]);
        recursion(candidates, target - candidates[i], list, result, i + 1);
        Integer remove = list.remove(list.size() - 1);
        // 如果删除的值与前一个相同,结束当前循环
        if (list.size() > 0 && remove.equals(list.get(list.size() - 1))) return;
    }
}

题解二

public List<List<Integer>> combinationSum2(int[] candidates, int target) {
    // 排序
    Arrays.sort(candidates);
    List<List<Integer>> result = new ArrayList<>();
    recursion(candidates, target, new ArrayList<>(), result, 0);
    return result;
}
public void recursion(int[] candidates, int target, List<Integer> list, List<List<Integer>> result, int start){
    if (target == 0){
        result.add(new ArrayList<>(list));
        return;
    }
    for (int i = start; i < candidates.length; i++){
        // 去重,本轮选择元素不能重复
        // 换句话解释:保证每次向下层递归时,当前层的组合是唯一的,这样能保证结果唯一
        if (i > start && candidates[i] == candidates[i - 1]) continue;
        if (candidates[i] > target){
            return;
        }
        list.add(candidates[i]);
        recursion1(candidates, target - candidates[i], list, result, i + 1);
        list.remove(list.size() - 1);
    }
}

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/combination-sum-ii