TODO:
1,思路对比和上一题
2,两题的细节对比;1)这题不能重复取数,2)但是有重复元素,可以都取,陷阱:重复数都相邻(因为排序了)除了第一个元素,其他的元素都可以pass不考虑,因为在这一排所有相同元素中第一个元素那里都考虑过了,如果在考虑就会出现重复结果。所以pass的话就用 if() continue就行了。
代码:
public class Solution {
public List<List<Integer>> combinationSum2(int[] candidates, int target) {
List<List<Integer>> list= new ArrayList<>();
if(candidates==null || candidates.length==0) return list;
Arrays.sort(candidates);
List<Integer> item= new ArrayList<>();
backTracking(list, item, 0, candidates, target);
return list;
}
private void backTracking(List<List<Integer>> list, List<Integer> item, int start, int[] candidates, int target){
if(target<0) return;
if(target==0){
list.add(new ArrayList<Integer>(item));
return;
}
for(int i=start; i<candidates.length; i++){
if(i!=start && candidates[i]==candidates[i-1]) continue;
// bad bug: i!=0 && ... this again reminds you where the i should start, not from 0, but the assigned start
item.add(candidates[i]);
backTracking(list,item,i+1, candidates, target-candidates[i]);
item.remove(item.size()-1);
}
}
}