这道题目难点是去重。要求组合不可以重复出现,但是同一数字仍然可以多次使用。我就是在combination sum的基础上加了一行判断语句。代码如下:
public class Solution {
public List<List<Integer>> combinationSum2(int[] candidates, int target) {
List<List<Integer>> result = new ArrayList<List<Integer>>();
if (candidates == null || candidates.length == 0) {
return result;
}
Arrays.sort(candidates);
helper(result, new ArrayList<Integer>(), 0, candidates, target);
return result;
}
public void helper(List<List<Integer>> result, List<Integer> sub, int position, int[] candidates, int target) {
if (target == 0) {
if (!result.contains(sub)) {
result.add(new ArrayList<Integer>(sub));
}
return;
}
for (int i = position; i < candidates.length; i++) {
if (target < candidates[i]) {
continue;
}
sub.add(candidates[i]);
helper(result, sub, i + 1, candidates, target - candidates[i]);
sub.remove(sub.size() - 1);
}
}
}