Puoi farlo in O(n)(dove nè il numero di cifre) in questo modo:
A partire da destra, trovi la prima coppia di cifre in modo tale che la cifra sinistra sia più piccola della cifra destra. Facciamo riferimento alla cifra sinistra con "cifra-x". Trova il numero più piccolo più grande di digit-x a destra di digit-x e posizionalo immediatamente a sinistra di digit-x. Infine, ordina le cifre rimanenti in ordine crescente - poiché erano già in ordine decrescente , tutto ciò che devi fare è invertirle (salvo per digit-x, che può essere posizionato nella posizione corretta in O(n)) .
Un esempio renderà questo più chiaro:
123.456.784.987,654321 millions
inizia con un numero
123456784 987654321
^ il primo posto da destra dove la cifra sinistra è inferiore alla destra
La cifra "x" è 4
123456784 987654321
^ trova la cifra più piccola più grande di 4 a destra
123456785 4 98764321
^ posizionalo a sinistra di 4
123456785 4 12346789
123.456.785.123,446789 millions
^ ordina le cifre a destra di 5. Poiché tutte tranne
i "4" erano già in ordine decrescente, tutto ciò che dobbiamo fare è
invertire il loro ordine e trovare il posto giusto per il "4"
Prova di correttezza:
Usiamo le lettere maiuscole per definire stringhe di cifre e lettere minuscole per le cifre. La sintassi ABsignifica "la concatenazione di stringhe Ae B" . <è l'ordinamento lessicografico, che è uguale all'ordinamento intero quando le stringhe di cifre hanno la stessa lunghezza.
Il nostro numero originale N è nella forma AxB, dove xè una singola cifra ed Bè ordinata in ordine decrescente.
Il numero trovato dal nostro algoritmo è AyC, dove y ∈ Bè la cifra più piccola > x (deve esistere a causa del modo in cui è xstata scelta, vedi sopra) , ed Cè ordinata in ordine crescente.
Supponiamo che ci sia un numero (usando le stesse cifre) N'tale che AxB < N' < AyC. N'deve iniziare Aaltrimenti altrimenti non potrebbe cadere tra di loro, quindi possiamo scriverlo nel modulo AzD. Ora la nostra disuguaglianza è AxB < AzD < AyC, che equivale a xB < zD < yCdove tutte e tre le stringhe di cifre contengono le stesse cifre.
Affinché ciò sia vero, dobbiamo avere x <= z <= y. Poiché yè la cifra più piccola > x, znon può essere tra loro, quindi o z = xo z = y. Say z = x. Quindi la nostra disuguaglianza è xB < xD < yC, il che significa B < Ddove entrambi Be Dhanno le stesse cifre. Tuttavia, B è ordinato in ordine decrescente, quindi non vi è alcuna stringa con quelle cifre più grandi di essa. Quindi non possiamo avere B < D. Seguendo gli stessi passaggi, vediamo che se z = y, non possiamo avere D < C.
Pertanto N'non può esistere, il che significa che il nostro algoritmo trova correttamente il numero più grande successivo.