Możesz to zrobić w O(n)(gdzie njest 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 ABoznacza „łączenie łańcuchów Ai 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 xjest pojedynczą cyfrą i Bjest posortowany malejąco.
Liczba znaleziona przez nasz algorytm to AyC, gdzie y ∈ Bjest najmniejsza cyfra > x (musi istnieć z powodu wybranego sposobu x, patrz wyżej) i Cjest 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, Ainaczej nie może się między nimi znaleźć, więc możemy napisać to w formie AzD. Teraz nasza nierówność jest AxB < AzD < AyCrówna, gdy xB < zD < yCwszystkie trzy ciągi cyfr zawierają te same cyfry.
Aby było to prawdą, musimy to zrobić x <= z <= y. Ponieważ yjest najmniejsza cyfra > x, znie może być między nimi, więc albo z = xalbo z = y. Powiedzmy z = x. Wtedy nasza nierówność jest xB < xD < yC, co oznacza, B < Dgdzie zarówno Bi Dmają 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 = ynie możemy D < C.
Dlatego N'nie może istnieć, co oznacza, że nasz algorytm poprawnie znajduje następną największą liczbę.