All Downloads are FREE. Search and download functionalities are using the official Maven repository.

g0001_0100.s0040_combination_sum_ii.Solution Maven / Gradle / Ivy

There is a newer version: 1.38
Show newest version
package g0001_0100.s0040_combination_sum_ii;

// #Medium #Array #Backtracking #Algorithm_II_Day_10_Recursion_Backtracking
// #2023_08_09_Time_2_ms_(99.75%)_Space_43.9_MB_(10.59%)

import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;

/**
 * 40 - Combination Sum II\.
 *
 * Medium
 *
 * Given a collection of candidate numbers (`candidates`) and a target number (`target`), find all unique combinations in `candidates` where the candidate numbers sum to `target`.
 *
 * Each number in `candidates` may only be used **once** in the combination.
 *
 * **Note:** The solution set must not contain duplicate combinations.
 *
 * **Example 1:**
 *
 * **Input:** candidates = [10,1,2,7,6,1,5], target = 8
 *
 * **Output:**
 *
 *     [
 *     [1,1,6],
 *     [1,2,5],
 *     [1,7],
 *     [2,6]
 *     ] 
 *
 * **Example 2:**
 *
 * **Input:** candidates = [2,5,2,1,2], target = 5
 *
 * **Output:**
 *
 *     [
 *     [1,2,2],
 *     [5]
 *     ] 
 *
 * **Constraints:**
 *
 * *   `1 <= candidates.length <= 100`
 * *   `1 <= candidates[i] <= 50`
 * *   `1 <= target <= 30`
**/
public class Solution {
    public List> combinationSum2(int[] candidates, int target) {
        List> sums = new ArrayList<>();
        // optimize
        Arrays.sort(candidates);
        combinationSum(candidates, target, 0, sums, new LinkedList<>());
        return sums;
    }

    private void combinationSum(
            int[] candidates,
            int target,
            int start,
            List> sums,
            LinkedList sum) {
        if (target == 0) {
            // make a deep copy of the current combination
            sums.add(new ArrayList<>(sum));
            return;
        }
        for (int i = start; i < candidates.length && target >= candidates[i]; i++) {
            // If candidate[i] equals candidate[i-1], then solutions for i is subset of
            // solution of i-1
            if (i == start || (i > start && candidates[i] != candidates[i - 1])) {
                sum.addLast(candidates[i]);
                // call on 'i+1' (not i) to avoid duplicate usage of same element
                combinationSum(candidates, target - candidates[i], i + 1, sums, sum);
                sum.removeLast();
            }
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy