順列のPython実装leetcode 46(バックトラック)

 

コレクション与えられた個別の整数、すべての可能な順列を返します。

例:

INPUT:[1,2,3] 
出力

[ [1,2,3]、
[1,3,2]、
[2,1]、[3]、
[2,3,1]、
[3,1,2 ]
[3,2,1]
]

次のようにバックトラックアルゴリズム自身の一案である:要素および他の操作を、my_numsデジタル追加の使用を保持し、削除する必要が
1  クラスのソリューション:
 2      DEF並び替える(セルフ、NUMS:リスト[INT]) - > リスト[リスト[INT]:
 3つの          結果= []
 4。          use_dict = dict.fromkeys(NUMS、偽)辞書を初期化する、デジタルの保存使用するかどうか
。5          DEF :バックトラック(結果、my_nums、use_dict)
 。6              場合でlen(my_nums)== LEN(NUMS):
 7                  tmp_nums = copy.deepcopy(my_nums)
 。8                  results.append(tmp_nums)
 。9                  リターン
10              
。11               X NUMS:
 12                  IF  ありませんuse_dict [X]:
 13                      use_dict [X] = Trueを
 14                      my_nums.append(X)  
 15                      バックトラック(その結果、my_nums、use_dict)
 16                      my_nums.remove(x)が   #1 时间削除操作耗费
17                      use_dictは、[X] = 18          バックトラックを(その結果、[]、use_dict)
 19の         リターン結果

24%以上については、一度にあまりにも多くを消費し、より多くの時間を費やす除去するための総合的なプログラム

 改良されたバージョン:

1  クラスのソリューション:
 2      DEF並べ替える(自己、NUMS:リスト[INT]) - > リスト[リスト[INT]:
 3つの          結果= []
 4          len_n = LEN(NUMS)
 5          DEF バックトラック(my_nums、use_nums):
 6              場合 LEN(my_nums)== len_n:
 7                  results.append(my_nums)
 8                  リターン
9              ための I における範囲(LEN(use_nums)):
 10                  、X = my_nums.copy()
 11                  x.append(use_nums [i])と
 12                 バックトラック(X、use_nums [:I] + use_nums [I + 1 :])
 13          バックトラック([]、NUMS)
 14の         リターン結果

これは、残りの使用可能な各再帰デジタルレンジ、ノーメンテナンス用デジタル辞書を削減します

あなたが操作を削除する必要はありませんので、my_nums毎回コピー、走行時間が短縮されます。 

98%以上のパイソンのスピード

 

 

---英語leetcodeステーションは最近移動し、そのタイトルは英語の説明になりました

おすすめ

転載: www.cnblogs.com/watch-fly/p/leetcode_46_watchfly.html