Anda dapat melakukannya di O(n)
( di mana n
jumlah digit) seperti ini:
Mulai dari kanan, Anda menemukan pasangan digit pertama sehingga digit kiri lebih kecil dari digit kanan. Mari merujuk digit kiri dengan "digit-x". Temukan angka terkecil lebih besar dari digit-x di sebelah kanan digit-x, dan letakkan segera di sebelah kiri digit-x. Akhirnya, urutkan digit yang tersisa dalam urutan menaik - karena mereka sudah dalam urutan menurun , yang perlu Anda lakukan adalah membalikkannya (simpan untuk digit-x, yang dapat ditempatkan di tempat yang benar di O(n)
) .
Contoh akan membuat ini lebih jelas:
123456784987654321
mulai dengan angka
123456784 987654321
^ tempat pertama dari kanan di mana digit kiri kurang dari kanan
Digit "x" adalah 4
123456784 987654321
^ temukan digit terkecil lebih besar dari 4 ke kanan
123456785 4 98764321
^ letakkan di sebelah kiri 4
123456785 4 12346789
123456785123446789
^ urutkan digit ke kanan 5. Karena semuanya kecuali
'4' sudah dalam urutan menurun, yang perlu kita lakukan adalah
membalikkan pesanan mereka, dan menemukan tempat yang tepat untuk '4'
Bukti kebenaran:
Mari kita gunakan huruf kapital untuk mendefinisikan digit-string dan huruf kecil untuk digit. Sintaks AB
berarti "rangkaian string A
dan B
" . <
adalah pemesanan leksikografis, yang sama dengan pemesanan integer ketika digit-string memiliki panjang yang sama.
Nomor asli N kami adalah dalam bentuk AxB
, di mana x
satu digit dan B
diurutkan menurun.
Angka yang ditemukan oleh algoritma kami adalah AyC
, di mana y ∈ B
digit terkecil > x
(harus ada karena cara x
itu dipilih, lihat di atas) , dan C
diurutkan naik.
Asumsikan ada beberapa nomor (menggunakan angka yang sama) N'
sehingga AxB < N' < AyC
. N'
harus dimulai dengan A
atau tidak bisa jatuh di antara mereka, sehingga kita dapat menulisnya di formulir AzD
. Sekarang ketidaksetaraan kami adalah AxB < AzD < AyC
, yang setara dengan di xB < zD < yC
mana ketiga digit-string berisi digit yang sama.
Agar hal itu benar, kita harus memilikinya x <= z <= y
. Karena y
merupakan digit terkecil > x
, z
tidak dapat di antara keduanya, demikian juga z = x
atau z = y
. Katakan z = x
. Maka ketidaksetaraan kita adalah xB < xD < yC
, yang berarti di B < D
mana keduanya B
dan D
memiliki angka yang sama. Namun, B adalah turun disortir, sehingga ada adalah tidak ada string dengan orang-digit lebih besar dari itu. Dengan demikian kita tidak dapat memiliki B < D
. Mengikuti langkah yang sama, kita melihat bahwa jika z = y
, kita tidak bisa D < C
.
Karenanya N'
tidak dapat ada, yang berarti algoritme kami dengan benar menemukan angka terbesar berikutnya.