Description
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.
Examples
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 static void comb(Set<List<Integer>> answer, List<Integer> c, List<Integer> currList, int target, int index){
if(target == 0){
answer.add(new ArrayList<>(currList));
return;
}
if(target < 0 || index == c.size() || target < c.get(index))
return;
int i;
for(i = index; i < c.size(); i++){
int temp = c.get(i);
currList.add(temp);
comb(answer, c, currList, target - temp, i + 1);
currList.remove(currList.size() - 1);
}
}
public List<List<Integer>> combinationSum2(int[] candidates, int target) {
Set<List<Integer>> answer = new HashSet<>();
int i;
List<Integer> cand = new ArrayList<>();
List<Integer> curr = new ArrayList<>();
for(i = 0; i < candidates.length; i++)
cand.add(candidates[i]);
Collections.sort(cand);
comb(answer, cand, curr, target, 0);
return new ArrayList<>(answer);
}
}
round 2
这次和39的round 2有点区别了!
在循环的时候增加了一个判断
if(i > start && candidates[i] == candidates[i - 1])
continue;
这样可以避免重复处理同一个数字的情况,上一次做的时候是通过Set进行筛选,不太得行,这次better!
完整代码如下
class Solution {
List<List<Integer>> finalAnswer = new ArrayList<>();
public List<List<Integer>> combinationSum2(int[] candidates, int target) {
Arrays.sort(candidates);
List<Integer> answer = new ArrayList<>();
dfs(answer, candidates, 0, target);
return finalAnswer;
}
public void dfs(List<Integer> answer, int[] candidates, int start, int target){
if(target < 0)
return;
if(target == 0){
finalAnswer.add(answer);
return;
}
for(int i = start; i < candidates.length; i++){
if(i > start && candidates[i] == candidates[i - 1])
continue;
if (candidates[i] > target)
break;
List<Integer> temp = new ArrayList<>(answer);
temp.add(candidates[i]);
dfs(temp, candidates, i + 1, target - candidates[i]);
}
return;
}
}