[構成]次にLeetcode_31

記事のディレクトリ:

  • タイトル
  • スクリプト
  • スクリプトロジック

トピック:

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

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

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

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

    完成!

おすすめ

転載: www.cnblogs.com/mailong/p/12051206.html