記事のディレクトリ:
- タイトル
- スクリプト
- スクリプトロジック
- スクリプト2
- スクリプトの2つのロジック
- シェル共有契約
トピック:
非反復配列要素の候補と目標数の目標を考えると、あなたはそのターゲット番号との組み合わせのためのすべての候補者を見つけることができます。
候補者の無制限番号が繰り返され、選択することができます。
説明:
(ターゲットを含む)すべての数値は正の整数です。
ソリューションセットは、その重複した組み合わせを含めることはできません。
例1:
入力:候補= [2,3,6,7-]、目標 = 7は、
セットが解決される:
[
[7]、
[2,2,3-]
]
例2:
入力:候補= [2,3,5]、目標 = 8は、
セットが解決される:
[
[2,2,2,2]、
[2,3,3]、
[3,5]
]
スクリプト:[使用:630ms]
クラスソリューション: デフcombinationSum(自己、候補:リスト[ INT ]、ターゲット:INT) - >一覧[一覧[ INT ]]: LIST1 = [] LIST3 = [] RET = [] のための私で候補者: list1.append(リスト(範囲(I、I + 1 ))) LIST2 = LIST1 [:] デフdiedai(L1、L2、ターゲット): N1 = LEN(L1) のための I における範囲(N1) のための J でL2: BB = L1 [i]が+ jの 場合 和(BB)<= ターゲット: BB。ソート() l1.append(BB) しばらくLIST2: LIST3 = [] のために私にLIST2: もし 和(I)== ターゲット: もし私ないでRET。 ret.append(I) list3.append(I) elifの 合計(I)< 対象: list3.append(I) LIST2 = LIST3 場合LIST2: N 2 = のみ(LIST2) diedai(LIST2、リスト1、ターゲット) デルLIST2 [ 0 :N2] 他: ブレーク リターン(右)
スクリプトロジック:
- メイン処理ロジックを次のように解決するために木の枝法を用いて、この質問:
- [2,3,6,7-]で、目標= 7ケースと説明するために、 "2" のみここにリスト要素を選択:2は、2 [[2,3]、[2,2]に分岐していてもよいです6]、[2,7]、これらの生成された要素を横断する、対象のものを除くと、次のサイクルが少ないターゲットよりもためにリストオフリストの和が特定のターゲットリストに記録されたものとの和に等しいより大きい、ループに入りますで削除コンテンツの元のリスト、前に、「2」を除きます
- 次トラバースオブジェクトは、[2,2]、[2,3]、それぞれ、生成されてもよい[2,2,2]、[2,2,3]、[2,2,6-]、[2,2,7であります]及び[2,3,2]、[2,3,3]、[2,3,6]、[2,3,7]、次いでさらに単一動作で
スクリプトII:[使用:100ミリ秒] [予約]
クラスのソリューション(オブジェクト): デフcombinationSum(自己、候補者、ターゲット): ""」 :タイプ候補:リスト[ INT ] :型ターゲット:INT :RTYPE:リスト[一覧[ INT ]] ""」 DEF searchSum(候補者、ターゲット): RES = [] のための I における範囲((候補)LEN)。 NUM = 候補[i]の 場合 NUM < 対象: #は、解の探索の現在位置から開始し、重いを移動するには L = searchSum(候補[I:]、標的- NUM) であれば!リットル= []: 用 ELE でL: ele.append() 何も =何も+ L elifのNUM == 対象: A = A + [NUM] 戻り、それを リターン searchSum(候補者、ターゲット)
スクリプトの2つのロジック:
- このスクリプトは、非常に困難な解決するために再帰関数に埋め込まれています
- いくつかのケースでは、RESは、L、Lであるが、NUM値を減算スライスを追加する必要があり、ターゲットの前に、スライスの組み合わせであります
- 各要素は、与えられたリストを横断することにより解決されます。
シェル処理シェア:
- https://blog.csdn.net/weixin_43428906/article/details/102923126