記事のディレクトリ:
- タイトル
- スクリプト
- スクリプトロジック
トピック:
取得された装置の機能を達成するため、所定のアルゴリズムは、辞書的に大きい構成で次のシーケンス番号を再配置が必要です。
次に大きな配列が存在しない場合、再配列アラインメント(すなわち、昇順)の最小数。
あなただけの一定の追加のスペースを許可する、編集を配置する必要があります。
以下は、右の列に対応する出力で、いくつかの例では、左側の入力欄です。
→1、3,2、2,3、
3,2,1→、2、3
1,1,5 1,5,1→
スクリプト:[使用:50msの] [予約]
クラスソリューション: デフ nextPermutation(自己、NUMS:リスト[INT]) - > なし: "" "DO は、何も返さ代わりに、インプレースNUMSを変更しない """ firstIndex = -1 のn = LEN(NUMS) デフリバース( NUMS、I、J): しばらく I < J: NUMS [i]は、NUMS [J] = NUMS [J]、NUMS [I] I + = 1 J - = 1 のための I における範囲(N-2、-1 、-1 ): もし NUMS [I] <NUMS [I + 1 ]: firstIndex = iが 破壊 #プリント(firstIndex)の 場合 firstIndex == -1 : 逆(NUMS、0、N -1 ) リターン secondIndex = -1 のための I における範囲(N-1、firstIndex、-1 ): もし NUMS [I ]> NUMS [firstIndex]: secondIndex = 私は 破壊 NUMS [firstIndex]、NUMS [secondIndex] = NUMS [secondIndex]、NUMS [firstIndex] 逆(NUMS、firstIndex +1、N-1)
スクリプトロジック:
- 私は適切な解決策を思い付くしていない、長い時間を考えて、この質問の法則を発見しませんでしたが、唯一の神の大きなシェアを見るために行くことができます
-
アイデア:
この質問は、ウィキペディアによると、以下に示します。 -
-
翻訳:
最大インデックスkを満たすNUMS [k]を見つける<NUMS [kに + 1]を、 そうでない場合、アレイ全体を反転させる。
その後、別のNUMSが最大インデックスl [L]に合致する検索> NUMS [k]を、
交換NUMS [L]及びNUMS [k]は、
最後のフリップフロッNUMS [K + 1]。
例えば:例えば、NUMS = [1,2,7,4,3,1]、次の順列は何ですか?
私たちは、最初のインデックスが最大のNUMSです見つける[1] = 2
第2のインデックスを見つけるためには最大NUMS [4] = 3であります
交換、NUMS = [1,3,7,4,2,1]。
フリップ、NUMS = [1,3,1,2,4,7]
完成!