方法(方法交換を使用して)。
パブリック クラスL46 { 公共 空バックトラック(int型 nは、ArrayListの<整数> NUMS、リスト<リスト<Integer型>>出力、INT 最初の){ 場合(最初== n)を{ output.add(新しいのArrayList <Integer型> (NUMS) ); } のための(INT iは最初=、I <N; iは++ ){ Collections.swap(NUMS、まず、I)。 バックトラック(N、NUMS、出力、最初 +1 )。 Collections.swap(NUMS、まず、I)。 } } パブリックリスト<リスト<Integer型>>並び替える(int型[] NUMS){ リスト <リスト<整数>>出力= 新しい LinkedListの<> (); ArrayListの <整数> nums_lst = 新しい ArrayListを<> (); 用(int型NUM:NUMS){ nums_lst.add(NUM)。 } INT N = nums.length。 バックトラック(N、nums_lst、出力、 0 ); 戻り値の出力; } }
第二の(遅いです):
クラスソリューション{ パブリックリスト<リスト<整数>>並び替える(INT [] NUMS){ int型のn = nums.length。 リスト <リスト<整数>>出力= 新規のArrayList <> (階乗(N))。 もし(N == 0)の戻り出力。 ブール []使用= 新しい ブール[N]。 一覧 <整数>パス= 新しい ArrayListを<> (); DFS(NUMS、nは、 0 、経路、使用される、出力)。 戻り値の出力; } プライベート int型の階乗(INT N){ int型 RES = 1 。 用(INT ; I <= N; iは2 = I ++ ){ RES * = I。 } 戻りRES。 } プライベート ボイド DFS(INT [] NUMS、INT LEN、INT深さ、一覧<整数>パス、ブール []を用い、リスト<リスト<整数>> RES){ 場合(深さ== LEN){ res.add(パス); リターン; } ため(INT I 0 =; I <LEN; I ++ ){ IF(!中古[I]){ // 1、現在の"状態"を表す新しい変数を作成するためのあらゆる試み。 一覧<整数> = NEWPATH 新しい新しいのArrayList <> (パス); newPath.add(NUMS [I]) ; ブール [] = newUsed 新しい新しい ブール[LEN]; (中古、System.arraycopyの 0は、newUsed、0 ;、LEN) newUsed [I] = trueに、 DFS(NUMS、lenは、深さ。+ 1 、NEWPATH、newUsed、RES) ; // 2、後戻りせず } } } }
(最も速い)第三:後戻り方法
パブリック クラスL46_2 { リスト <リスト<Integer型>> ANS = 新しい ArrayListを<> (); ブール[]訪問しました。 公共リスト<リスト<Integer型>>並び替える(INT [] NUMS){ 訪問 = 新しい ブール[nums.length]。 ヘルパー(NUMS、新しい LinkedListは<> ()); 戻り値は、ANS; } ボイドヘルパー(INT [] NUMS、LinkedListの<整数> のリスト){ 場合(はlist.size()== nums.length){ ans.add(新規のArrayList <>(リスト))。
ルートが返されるので//パス変数オブジェクトは、完全なプロセスの再帰的深さ優先トラバーサル中に、一つだけを指摘した後
//(深い浅い接合ノードから戻って、私たちは前に言ったように、必要性が以前に選択解除)、この変数のルートへのパスバックは、すべての後に空になるようにします。
// Javaでのアドレス、それらはパラメータ渡し、すべての変数のコピー中値、オブジェクト型の変数で渡されているので。
//アドレスはRES変数に、実際のポイントで同じメモリアドレスに追加されたので、私たちは、オブジェクトの6つの空のリストが表示されます。
リターン; } ため(INT iは= 0; I <nums.length; I ++ ){ 場合(!訪問[I]){ 訪問[I] = 真。 list.add(NUMS [I])。 ヘルパー(NUMS、リスト)。 list.removeLast(); [i]が訪れた = 偽; } } } }