タイトル:整数のアレイを考えるは、重複する要素を含んでいてもよいNUMSすべての可能なサブセット(パワー設定)の配列を返し、。説明:ソリューションセットの重複サブセットを含めることはできません。
入力:[1,2,2]出力:[[2]、[1]、[1,2,2]、[2,2]、[1,2]、[]]
出典ます。https://leetcode-cn.com/problems/subsets-ii/
アクトワン:タイムコードの自身の98%以上
アイデア:ノードが以前の値に等しく、上部一つはスタックにプッシュされ、スタックは次ある場合プルーニング観察条件を引き出すことによって、それが切断する必要があり、ソートする同じ番号が決定されますより多くの時間を節約します。
タイピングのインポートリスト からコレクションのインポートカウンター クラス:ソリューション DEF > - :subsetsWithDup(一覧の[int]はセルフ、NUMS)一覧[一覧[INT]: 結果 = [] L = lenは(NUMS) #のメソッド #デジタルプレスプルーニングをプルーニング数を減らすために、事前にソートオブジェクトを下降出現頻度、 #[アイテムのアイテムのため、カウンタC(NUMS).most_common()にするための項目[商品] * C] NUMS = #今回周波数に並べ替えた場合、直接、反復要素を注文していない場合は、短くなります 。#ジスルホン IF L == :lenは(SET(NUMS)) nums.sort() 他の: NUMS = [アイテムのためのアイテム、C におけるカウンタ(NUMS).most_common()のための項目で [商品] * C] DEFバックトラック(A = []、NUMS = NUMS、COUNT = 0、サイン= 0): IF COUNT = = L: results.append([:]) 印刷(結果)を 復帰 するための I における[NUMS [COUNT]: COUNTの + = 1。 #ノードである場合、描画によっては、二つの数が同じである場合、ことを観察することができますスタック、スタックは次のノードで、枝はカット、でなければなりません #ノードがスタック上にある場合、この条件はプルーンに相当し、スタックが隣にあり、必要かつ十分な条件である、 #1 のためのログインタグは、スタックまたはスタックであります #プルーン実行するか否かを判定するための条件IF IF(> COUNT 1)&(NUMS [-COUNT 1] == NUMS [COUNT-2])&(サイン== 0): a.append(I) サイン = 0 バックトラック(、COUNT = COUNT、ログイン= 記号) #問題にスタックした後、スタックをプッシュバックすることを忘れないようにしてください、それはミスを作ることは非常に簡単になります (a.pop) #=の後ろに行っていない枝を切断 、他: a.append(I) サイン = 0 バックトラック(A、COUNT = COUNT、サイン= サイン) a.pop() サイン = 1 バックトラック(カウント =カウント数、記号= 記号) バックトラック() 戻り結果 場合 __name__ == ' __main__ ' : duixiang = ソリューション() A = duixiang.subsetsWithDup([1、2,1、2 ]) 、印刷()