题目:
这道题和前一道 组合总和 极其相似,不同点在于有重复元素,且每个数只能取一次
我们只需要在前一道题的代码上稍作修改,就可以完成这道题的要求
代码:
class Solution {
List<List<Integer>> res =new ArrayList<List<Integer>>();
public List<List<Integer>> combinationSum2(int[] candidates, int target) {
List<Integer> temp = new ArrayList<Integer>();
Arrays.sort(candidates);
int n=candidates.length;
//当长度为0时,直接返回空列表
if(n==0) return res;
findcombinationSum(candidates,0,target,new Stack<Integer>());
//利用set数组去重
res=new ArrayList<List<Integer>>(new HashSet<List<Integer>>(res));
return res;
}
public void findcombinationSum(int [] nums,int now,int target,Stack<Integer> pre){
for(int i=now;i<nums.length && target-nums[i]>=0 ;i++){
pre.add(nums[i]);
//当剩余目标值为0时,添加列表
if(target-nums[i]==0){
res.add(new ArrayList<Integer>(pre));
}
if(i+1<nums.length)
findcombinationSum(nums,i+1,target-nums[i],pre);
pre.pop();
}
}
}