给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
candidates 中的每个数字在每个组合中只能使用一次。
注意:解集不能包含重复的组合
class Solution {
List<List<Integer>> lists=new ArrayList<>();
Deque<Integer> deque=new LinkedList<>();
int sum=0;
public List<List<Integer>> combinationSum2(int[] candidates, int target) {
Arrays.sort(candidates);
boolean []flag=new boolean[candidates.length];
backTracking(candidates,target,0,flag);
return lists;
}
public void backTracking(int[]arr,int target,int index,boolean[]flag){
if(sum==target){
lists.add(new ArrayList(deque));
return;
}
for(int i=index;i<arr.length&&arr[i]+sum<=target;i++){
if(i>0&&arr[i]==arr[i-1]&& !flag[i-1]){
continue;
}
flag[i]=true;
sum+=arr[i];
deque.push(arr[i]);
backTracking(arr,target,i+1,flag);
int temp=deque.pop();
flag[i]=false;
sum-=temp;
}
}
}