【LeetCode] 46.完全な配列

方法(方法交換を使用して)。

パブリック クラス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]が訪れた = ; 
            } 
        } 
    } 
}

 

おすすめ

転載: www.cnblogs.com/doyi111/p/12629130.html