取り決めの下で、[A] [LeetCode法律を見つけます]

取得された装置の機能を達成するため、所定のアルゴリズムは、辞書的に大きい構成で次のシーケンス番号を再配置が必要です。

次に大きな配列が存在しない場合、再配列アラインメントの最小の数(すなわち、昇順)。

あなただけの一定の追加のスペースを許可する、編集を配置する必要があります。

いくつかの例では、左側の入力欄には、対応する出力は、右欄には、以下の通りです。
→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())。
} 
}。

おすすめ

転載: www.cnblogs.com/yinbiao/p/11348134.html