コレクション与えられた個別の整数、すべての可能な順列を返します。
例:
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の リターン結果
改良されたバージョン:
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ステーションは最近移動し、そのタイトルは英語の説明になりました