1. 程式人生 > 實用技巧 >40. 組合總和 II

40. 組合總和 II

題目:給定一個數組 candidates 和一個目標數 target ,找出 candidates 中所有可以使數字和為 target 的組合。candidates 中的每個數字在每個組合中只能使用一次(新增要求)。
說明:
所有數字(包括目標數)都是正整數。
解集不能包含重複的組合。

示例 1:
輸入: candidates = [10,1,2,7,6,1,5], target = 8,
所求解集為:
[[1, 7],[1, 2, 5],[2, 6],[1, 1, 6]]

程式碼: //在力扣39題的基礎上修改2處地方即可
class Solution {
public List<List> combinationSum2(int[] candidates, int target) {
var list=new ArrayList<List>();
var arr=new ArrayList();
int sum=0;
Arrays.sort(candidates);
backTrack(list,arr,candidates,target,0);

return list;
}
public  static void backTrack(List<List<Integer>> alist,List<Integer> arr,int[] acandidates, int atarget,int t){
    if(atarget==0){
        var temp=new ArrayList<Integer>(arr);
        if(!alist.contains(temp)){    //修改處1,因為元素使用次數由多次轉變成1次,所以在先排序基礎上,重複元素選出來的是同一個陣列列表,所以要先判斷是否已存在。  
        alist.add(temp);}
    }
    if(atarget>0){
        for(int i=t;i<acandidates.length;i++){               
             if(acandidates[i]<=atarget){
                 arr.add(acandidates[i]);
                 backTrack(alist,arr,acandidates,atarget-acandidates[i],i+1);  //修改處2,由i變為i+1,因為不能重複選同一個,所以下標後移一位
                 arr.remove(arr.size()-1) ; }  //數字和小於目標數                          
        }
    }
}

}