Given a collection of candidate numbers (candidates) and a target number (target), find all unique combinations in candidates where the candidate numbers sums to target.
Each number in candidates may only be used once in the combination.
Note:
All numbers (including target) will be positive integers. The solution
set must not contain duplicate combinations. Example 1:Input: candidates = [10,1,2,7,6,1,5], target = 8, A solution set is: [
[1, 7], [1, 2, 5], [2, 6], [1, 1, 6] ] Example 2:Input: candidates = [2,5,2,1,2], target = 5, A solution set is: [
[1,2,2], [5] ]
数组中的数字之和等于给定的数字
重点:数组中可能会出现重复的数字,需要进行去重
class Solution {
public List<List<Integer>> combinationSum2(int[] candidates, int target) {
Arrays.sort(candidates);
return combinationSum1(candidates, target, 0);
}
public List<List<Integer>> combinationSum1(int[] candidates, int target, int begin) {
int n =candidates.length;
List<List<Integer>> ret = new ArrayList();
for(int i = begin; i < n; i++){
int num = candidates[i];
if(i > begin && candidates[i - 1] == candidates[i]) {
//对比combination sum,本数组中会出现重复的数字,所以在遍历的时候,去除已计算过的重复的数字
continue;
}
if(num > target) {
return ret;
} else if(num == target) {
List<Integer> com = new ArrayList();
com.add(num);
ret.add(com);
return ret;
} else {
List<List<Integer>> temp = combinationSum1(candidates, target - num, 1 + i);
if(temp.size() > 0) {
for(int j = 0 ;j < temp.size(); j++) {
List<Integer> com = temp.get(j);
com.add(num);
ret.add(com);
}
}
}
}
return ret;
}
}