g0001_0100.s0040_combination_sum_ii.Solution Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of leetcode-in-java Show documentation
Show all versions of leetcode-in-java Show documentation
Java-based LeetCode algorithm problem solutions, regularly updated
package g0001_0100.s0040_combination_sum_ii;
// #Medium #Array #Backtracking #Algorithm_II_Day_10_Recursion_Backtracking
// #2022_06_15_Time_4_ms_(86.03%)_Space_45.1_MB_(10.93%)
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
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();
}
}
}
}