正の整数 (数字の配列の形式) を指定します。指定された数字の 1 組の数字を入れ替えることができます。取得できる最小の整数を返す必要があります。有効な整数である必要があることに注意してください。つまり、先頭に 0 を含めないでください。
例えば:-
- 93561 は 13569 を返します
- 596 リターン 569
- 10234 は 10234 を返します
- 120 リターン 102
- 10091 は 10019 を返します
- 98761111 は 18761119 を返します
O(n)
この問題のアルゴリズムはありますか。私はこれのためにいくつかの方法を考えました:-
- 分を見つけます。指定された整数 (0 を除く) の数字 (
minDIgit
) を MSB と交換しMSB != minDigit
ます。の場合MSB==minDigit
、次の分を見つけます。桁を変更し、最上位 2 桁以外の桁などと交換します。これはO(n^2)
最悪の場合である可能性があります。 array/vector
of digitstd::pair
と index を作成し、昇順で並べ替えます (数字の値に従って、数字の値を一致させるために低いインデックスを最初に保持します)。ソートされた配列を反復処理します。MSB を最初の桁と入れ替えます。最小桁に対応するインデックスが MSB である場合、MSB を 1 桁だけ次の最小桁と交換します。次の最小桁に対応する MSB の 1 桁のインデックスがある場合、MSB の 2 桁をこの次の最小と交換します。桁など。これはする必要がありますO(nlog(n))
。
誰かがより良いアルゴリズムを提案できますか?
更新 1:
少し考えた後、私が提案した 2 番目のアルゴリズムは完全に正常に機能します (おそらく、個別に処理できるいくつかのコーナー ケースを除く)。さらに、(数字の値に応じて)カウントソートを使用してペア(数字、インデックス)をソートできます。これは時間的に安定したソートO(n)
です。私の主張に誤りはありますか?
更新 2:
私の 2 番目のアルゴリズムは機能します (ただし、コーナー ケースと 0 のチェックが増えますO(n)
) counting sort
。しかし、@ GaborSch が提供する解決策ははるかに簡単なので、アルゴに適切なコードを提供することはあまり気にしません。