Problem
Given a collection of candidate numbers (C) and a target number (T), find all unique combinations in C where the candidate numbers sums to T.
Each number in C may only be used once in the combination.
Notice
All numbers (including target) will be positive integers.
Elements in a combination (a1, a2, … , ak) must be in non-descending order. (ie, a1 ≤ a2 ≤ … ≤ ak).
The solution set must not contain duplicate combinations.
Example
Given candidate set [10,1,6,7,2,1,5] and target 8,
A solution set is:
[
[1,7],
[1,2,5],
[2,6],
[1,1,6]
]
思路
和 Subsets II 差不多
public List<List<Integer>> combinationSum2(int[] nums, int target) {
List<List<Integer>> result = new ArrayList<>();
if (nums == null || nums.length == 0) {
return result;
}
Arrays.sort(nums);
helper(nums, result, new ArrayList<Integer>(), target, 0);
return result;
}
private void helper(int[] nums, List<List<Integer>> result, List<Integer> path, int target, int startIndex) {
int index = startIndex;
while (index < nums.length) {
path.add(nums[index]);
target -= nums[index];
if (target == 0) result.add(new ArrayList<Integer>(path));
if (target > 0) helper(nums, result, path, target, index + 1);
target += nums[index];
path.remove(path.size() - 1);
index++;
while (index < nums.length && nums[index] == nums[index - 1]) index++;
}
}