次配列(Leetcode31)通訳

このコードは、彼らの個人的な理解のうえ、Leetcode正式タイトルから来て、よりよく理解するために読者を有効にするために、独自のノートを生成します。侵害した場合、すぐにそれを削除します!

パブリック クラスMain31 { 

    公共 静的 ボイドメイン(文字列[]引数){
         INT [] = ARR 新しい新規 のint [] {9 ,. 5 ,. 3 ,. 1。}; 
        nextPermutation(ARR); 
    } 

    / ** 
     *核となるアイデアは:考えます降順は次の高次を有していなくてもよい。
     *まずスキャン[I-1] < [i]は、所与のアレイの右側から、(コア思想に反して、プロセス)
     2. * [I-1]固定位置、最初の[I-1]多数[J]見つけるよりも右側(右から左)、
     * 3交換[Iを-1]と[j]の値。交換比べ多数からなる第1の最後の番号の右側に[I-1]ではない前に、この時点では、[I-1]、次に高い要素の最初の位置である
     * 4。 [I-1]右(前降順、昇順)再配置最小であり、この場合には、元の数が数よりも多い数で構成されている; 
     * @param NUMS
      * / 
    パブリック 静的 ボイド nextPermutation(INT [] NUMS){
         int型 I = -nums.length 1;   // インデックスの最後から二番目の要素

        一方(I-1> = 0 && NUMS [I] <= NUMS [-I 1。]){ / * OK NUMS [I-1]の位置、すなわちNUMS [I-1] <NUMS [i]は、 I-1は、簡略化された位置を決定する* / 
            Iを - ; 
        } 
        IF(I-1> = 0){   / * もし私はまた、アレイの位置、すなわちNUMS [i]は<iは+ 1] NUMS * /   / * iが配列されていない下降アレイ、直接反転は列の最小数にせ遭遇* / 
            INT J NUMSを=を。 1長;    / * iはゾーンの右端Jの右側に位置する/ * 
            ながら([1-I] J> = 0 && NUMS [J] <= NUMS){   / * 第NUMS [j]を見つけます。 NUMSより大きい倍[I-1]の位置、この時刻jも(確かに配列jにおける、もちろん)アレイで満たす* / 
                J- ;    / * J停止位置は、第1の位置NUMSより大きい[I-1]、前記* / 
            } 
            スワップ(NUMS ,. 1-I、J);   / * 交換NUMS [I-1]、NUMS [ 値j]がある* / 
        } 
        リバース(NUMS、I); / * 昇順に、降順でIの権利を逆* / 
    } 

    プライベート 静的 ボイド(逆値int [] NUMSをint型スタート){
         int型私は= 開始、
         INT = nums.length 1-J。;
         ながら(私は< J)を{ 
            スワップ(NUMS、I、J); 
            私は ++ 
            J- ; 
        } 
    } 

    プライベート 静的 ボイドスワップ(int型 [] NUMSを、int型 I、INT {J)
         のint TEMP = NUMS [I]を、
        NUMS [I] =のNUMS [J]。
        NUMS [J] = TEMP。
    } 
}

 

おすすめ

転載: www.cnblogs.com/startelk/p/11305980.html