連続した配置。カジュアル作業が質問、例の意味で、
1,2,3
→1,3,2
3,2,1
→1,2,3
1,1,5
→1,5,1
自体のような下降がある場合[3、2、1]を返し[1、2、3]。このような[1、5、8、のように、それの通常の例を実行して4、7、6、5、3、1]、その次の順列である[1、5、8、5、1、3、4、6 、7]。彼の次の配置が4の最小比を見つけるために必要とされる、入力自体が置換され、そして辞書式順序に基づいているので、後者の5桁4降順(7、6、5、3、1)ことが見出されました多数(5)と逆の後ろ4を昇順に全ての数。この考え方によれば、iは番号(4)を見つけるために、右から左へ掃引ポインタを使用するアレイの必要性の始まりが最初の停止の昇順ではないので、そして右から左へ、第2のポインタj秒スイープこのとき、複数の第4大量以上を探しているが、位置5で停止する; 5 4に位置の変化に伴って、
[1、5、8、 4、7、6、 5、3、1] - > [1、5、8、 5、7、6、 4、3、1]
最後に、反転5つの数字の後、次のように、順列を取得します。
[1、5、8、 5、7、6、 4、3、1 ] - > [1、5、8、5、1、3、4、6、7 ]
時間O(N)
スペースO(1)
1 / * * 2 * @param {番号[]} NUMSは 3 * @return {空}、何も返さ代わりに、インプレースNUMSを変更しないでください。 4 * / 5 VAR nextPermutation = 関数(NUMS){ 6は、 iがnums.length =せ- 2 。 7 一方(I> = 0 && NUMS [I]> = NUMS [I + 1 ]){ 8 i-- 。 9 } 10 であれば(I> = 0 ){ 11 のlet J = nums.length - 1 。 12 一方(J> = 0 && NUMS [J] <= NUMS [I]){ 13 j-- ; 14 } 15 スワップ(NUMS、I、J)。 16 } 17 逆(NUMS、I + 1 )。 18 }。 19 20 VaRは逆= 関数(NUMS、開始){ 21 iは=せ始めます。 22 のlet J = nums.length - 1 。 23 一方(I < J){ 24 スワップ(NUMS、I、J)。 25 I ++ ; 26 j-- ; 27 } 28 }。 29 30 VARスワップ= 関数(NUMS、I、J){ 31 LETのTEMP = NUMS [I]。 32 NUMS [I] = NUMS [J]。 33 NUMS [J] = TEMP。 34 }。