-40の特別なバックトラックLeetcode。全組成物II(組合せ合計II)

-40の特別なバックトラックLeetcode。全組成物II(組合せ合計II)

 

 

配列を指定  candidates し、目標数を  target 、見つける  candidates すべての数字をとのために作ることができます  target 組み合わせ。

 

candidates 各番号は、各組み合わせで一度使用することができます。

 

説明:

 

  • (目標数を含む)すべての数値は正の整数です。
  • ソリューションセットは、重複の組み合わせを含めることはできません。 

 

例1:

 

入力:=において候補  [10,1,2,7,6,1,5]、=目標は  8
セットが解決される:
[ 
  [1,7]、
  [1、2、5]、
  [2,6]、
  [1,1]、[6] 
]

 

例2:

 

入力:候補= [2,5,2,1,2]、目標 = 5は、 
セットが解決される:
[ 
  [1,2,2]、
  [5] 
] 


と同様タイトル(Leetcode.39)を保持:分析違いは、この問題は一度だけ、各番号を使用することができるということです。それでも同じ考え(バックトラック)、
ターゲットの最初の注文をスキップよりも大きいです。

バックトラック- >例
候補=  [10,1,2,7,6,1,5]、ターゲット= 8 , 排序后candidates = [1,1,2,5,6,7,10]
首先,入口是dfs(index=0)
选第一个1,这里我们标记为step1,
接着继续选取第二个1,标记为step2,
继续选2,step3,
选5,标记为step4,
此时已超出target=8(此时为9),故大于了target,根据代码return到上一步,返回到step4,不选5,选6
超出,退回,不选6,选7,超出,退回,选10,超出,退回。(我的AC代码里在后面还是循环了,所以浪费了很多时间,可以发现大于的就直接返回,不进入下一步了)

以此类推。因此第一个产生出来的答案应该是 1 2 5



ACコード:
クラスのソリューション{ 
    リスト <リスト<Integer型>> ANS = 新しい ArrayListを<> ();
    公衆リスト<リスト<整数>> combinationSum2(INT []の候補、int型のターゲット){ 
        は、Arrays.sort(候補)。
        DFS(候補者、ターゲット、 0、ターゲット、新しいのArrayList <Integer型> ());
        戻るANSを。
    } 
    
    
    公共 ボイド DFS(INT []の候補、int型のターゲット、int型のインデックス、int型のバランス、のArrayList <整数> リスト){
         場合(バランス<0){
             返します
        } 
        であれば(バランス== 0 ){
             もし ans.add((ans.contains(リスト)!)新規のArrayList <整数> (リスト))。
            返します
        } 
        
        場合(インデックス> = candidates.length){
             返します
        } 
        INT NUM = 候補[インデックス]。
        
        list.add(NUM)。
        DFS(候補者、ターゲット、インデックス + 1、balance- NUM、リスト)。
        list.remove(はlist.size() -1 )。
        DFS(候補者、ターゲット、インデックス +1 、バランス、リスト)。

    } 
}
 

 

 











 

おすすめ

転載: www.cnblogs.com/qinyuguan/p/11318820.html