Możesz to zrobić w O(n)
(gdzie n
jest liczba cyfr) w następujący sposób:
Zaczynając od prawej, znajdziesz pierwszą parę cyfr, dzięki czemu lewa cyfra jest mniejsza niż prawa cyfra. Odwołajmy się do lewej cyfry przez „digit-x”. Znajdź najmniejszą liczbę większą niż cyfra-x na prawo od cyfry-x i umieść ją bezpośrednio na lewo od cyfry-x. Na koniec posortuj pozostałe cyfry w porządku rosnącym - ponieważ były one już w kolejności malejącej , wystarczy je odwrócić (z wyjątkiem cyfry-x, którą można umieścić we właściwym miejscu O(n)
) .
Przykład wyjaśni to:
123456784987654321
zacznij od liczby
123456784 987654321
^ pierwsze miejsce z prawej strony, w którym lewa cyfra jest mniejsza niż prawa
Cyfra „x” to 4
123456784 987654321
^ znajdź najmniejszą cyfrę większą niż 4 po prawej stronie
123456785 4 98764321
^ umieść go na lewo od 4
123456785 4 12346789
123456785123446789
^ posortuj cyfry po prawej stronie 5. Ponieważ wszystkie oprócz
„4” były już w porządku malejącym, wszystko, co musimy zrobić, to
odwróć ich kolejność i znajdź właściwe miejsce dla „4”
Dowód poprawności:
Użyjmy wielkich liter, aby zdefiniować ciągi znaków i małe litery dla cyfr. Składnia AB
oznacza „łączenie łańcuchów A
i B
” . <
to uporządkowanie leksykograficzne, które jest takie samo jak uporządkowanie liczb całkowitych, gdy ciągi cyfr są równej długości.
Nasz oryginalny numer N ma postać AxB
, gdzie x
jest pojedynczą cyfrą i B
jest posortowany malejąco.
Liczba znaleziona przez nasz algorytm to AyC
, gdzie y ∈ B
jest najmniejsza cyfra > x
(musi istnieć z powodu wybranego sposobu x
, patrz wyżej) i C
jest posortowana rosnąco.
Załóżmy, że istnieje pewna liczba (przy użyciu tych samych cyfr), N'
taka jak AxB < N' < AyC
. N'
musi zaczynać się od tego, A
inaczej nie może się między nimi znaleźć, więc możemy napisać to w formie AzD
. Teraz nasza nierówność jest AxB < AzD < AyC
równa, gdy xB < zD < yC
wszystkie trzy ciągi cyfr zawierają te same cyfry.
Aby było to prawdą, musimy to zrobić x <= z <= y
. Ponieważ y
jest najmniejsza cyfra > x
, z
nie może być między nimi, więc albo z = x
albo z = y
. Powiedzmy z = x
. Wtedy nasza nierówność jest xB < xD < yC
, co oznacza, B < D
gdzie zarówno B
i D
mają takie same cyfry. Jednakże, B jest posortowana malejąco, więc nie jest żaden ciąg cyfr z tych większych od niego. Dlatego nie możemy mieć B < D
. Po tych samych krokach widzimy, że jeśli z = y
nie możemy D < C
.
Dlatego N'
nie może istnieć, co oznacza, że nasz algorytm poprawnie znajduje następną największą liczbę.