Sie können dies folgendermaßen tun O(n)
(wo n
ist die Anzahl der Ziffern):
Ausgehend von rechts finden Sie das erste Ziffernpaar so, dass die linke Ziffer kleiner als die rechte Ziffer ist. Beziehen wir uns auf die linke Ziffer mit "digit-x". Suchen Sie die kleinste Zahl größer als Ziffer-x rechts von Ziffer-x und platzieren Sie sie unmittelbar links von Ziffer-x. Sortieren Sie abschließend die verbleibenden Ziffern in aufsteigender Reihenfolge - da sie bereits in absteigender Reihenfolge waren, müssen Sie sie nur umkehren (außer für Ziffer-x, die an der richtigen Stelle in platziert werden kann O(n)
) .
Ein Beispiel wird dies deutlicher machen:
123456784987654321
Beginnen Sie mit einer Zahl
123456784 987654321
^ die erste Stelle von rechts, wo die linke Ziffer kleiner als die rechte ist
Die Ziffer "x" ist 4
123456784 987654321
^ Finde die kleinste Ziffer größer als 4 rechts
123456785 4 98764321
^ Platziere es links von 4
123456785 4 12346789
123456785123446789
^ sortiere die Ziffern rechts von 5. Da alle außer
Die '4' waren bereits in absteigender Reihenfolge, alles was wir tun müssen ist
kehre ihre Reihenfolge um und finde den richtigen Platz für die '4'
Korrektheitsnachweis:
Verwenden wir Großbuchstaben, um Ziffernfolgen und Kleinbuchstaben für Ziffern zu definieren. Die Syntax AB
bedeutet "die Verkettung von Zeichenfolgen A
und B
" . <
ist die lexikografische Reihenfolge, die der ganzzahligen Reihenfolge entspricht, wenn die Ziffernfolgen gleich lang sind.
Unsere ursprüngliche Nummer N hat die Form AxB
, wobei x
es sich um eine einzelne Ziffer B
handelt, die absteigend sortiert ist.
Die Zahl gefunden von unserem Algorithmus ist AyC
, wo y ∈ B
ist die kleinste Ziffer > x
(es existieren muss aufgrund der Art und Weise x
oben gewählt wurde, sehen) , und C
wird sortiert aufsteigend.
Angenommen, es gibt eine Zahl (mit denselben Ziffern), N'
so dass AxB < N' < AyC
. N'
muss damit beginnen A
oder es könnte nicht zwischen sie fallen, damit wir es in der Form schreiben können AzD
. Jetzt ist unsere Ungleichung AxB < AzD < AyC
gleichbedeutend damit, xB < zD < yC
dass alle drei Ziffernfolgen die gleichen Ziffern enthalten.
Damit das wahr ist, müssen wir haben x <= z <= y
. Da y
ist die kleinste Ziffer > x
, z
kann nicht zwischen ihnen sein, also entweder z = x
oder z = y
. Sagen Sie z = x
. Dann ist unsere Ungleichung xB < xD < yC
, was bedeutet, B < D
wo beide B
und D
die gleichen Ziffern haben. Jedoch ist B Absteigen sortiert, so dass es ist keine Zeichenfolge mit diesen Ziffern größer , als es. Also können wir nicht haben B < D
. Wenn z = y
wir die gleichen Schritte ausführen, sehen wir, dass wir es nicht haben können D < C
.
Daher N'
kann es nicht existieren, was bedeutet, dass unser Algorithmus die nächstgrößere Zahl korrekt findet.