取得された装置の機能を達成するため、所定のアルゴリズムは、辞書的に大きい構成で次のシーケンス番号を再配置が必要です。
次に大きな配列が存在しない場合、再配列アラインメントの最小の数(すなわち、昇順)。
あなただけの一定の追加のスペースを許可する、編集を配置する必要があります。
いくつかの例では、左側の入力欄には、対応する出力は、右欄には、以下の通りです。
→1、3,2、2,3、
3,2,1→、2、3
1,1,5 1,5,1→出典:滞在ボタン(LeetCode)
リンク:https://leetcode-cn.com/problems/next-permutation
分析:
方法1:直接転送API、next_permutation機能
PS:私はこの方法をお勧めしません。
方法2:法律を見つけます
、それは現在のシーケンスは、次の配列である配列54321、12345であることを示していない場合はまず、最も高いインデックスkを見つけ、V [k]を満たす<V [kは1 +]、及び、直接配列全体を裏返し
2.また、最大インデックスLを見つけるために、V [L]> V [k]を満たします
3.交換V [L]およびV [k]は
4.ターンV [K + 1、エンド]
一つの文章に要約する:フォワードトラバース値xから最初の下降を見つけ、その後、バックから最初の値がyの値よりも大きい見つけるために、2つの値を入れ替え、値の反転の最後の後ろに値へ
時間複雑:O(N)
宇宙複雑:O(1。 )
クラス解決{ パブリック: ボイド nextPermutation(ベクトル< INT >&V) { int型 N = v.size()。 もし(N == 1 ) のリターン; int型フラグ= 0 。 int型のk; 用(int型 I = N- 2、I> = 0 ; i-- ) { 場合(V [I] <V [I + 1 ]) { フラグ = 1 。 K = I。 COUT << K << ENDL。 破ります; } } もし(フラグ== 0 ) { 逆(v.begin()、v.end())。 返します。 } int型のL。 INT X = V [k]は、 用(int型 I = N- 1、I> = K; i-- ) { 場合(V [I] == X) { L = I。 X = V [i]は、 } そう であれば(V [i]が> X) { L =私; 破ります; } } スワップ(V [k]は、V [L])。 逆(v.begin() + K + 1 、v.end())。 } }。