parent
a898a5e7c3
commit
361277d7b0
@ -0,0 +1,38 @@
|
||||
package 回溯法.q40_组合总和2;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
* 回溯法 O(n*log(n))
|
||||
*/
|
||||
class Solution {
|
||||
|
||||
public List<List<Integer>> combinationSum2(int[] candidates, int target) {
|
||||
List<List<Integer>> res = new ArrayList<>();
|
||||
if (candidates.length == 0) {
|
||||
return res;
|
||||
}
|
||||
Arrays.sort(candidates);
|
||||
helper(candidates, target, 0, new LinkedList<>(), res);
|
||||
return res;
|
||||
}
|
||||
|
||||
public void helper(int[] candidates, int target, int start, LinkedList<Integer> stack, List<List<Integer>> res) {
|
||||
if (start > candidates.length) {
|
||||
return;
|
||||
}
|
||||
if (target == 0 && !stack.isEmpty()) {
|
||||
List<Integer> item = new ArrayList<>(stack);
|
||||
res.add(item);
|
||||
}
|
||||
HashSet<Integer> set = new HashSet<>();
|
||||
for (int i = start; i < candidates.length; ++i) {
|
||||
if (!set.contains(candidates[i]) && target >= candidates[i]) {
|
||||
stack.push(candidates[i]);
|
||||
helper(candidates, target - candidates[i], i + 1, stack, res);
|
||||
stack.pop();
|
||||
set.add(candidates[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in new issue