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 AB
significa "la concatenazione di stringhe A
e 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 è x
stata 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 A
altrimenti 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 < yC
dove 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
, z
non può essere tra loro, quindi o z = x
o z = y
. Say z = x
. Quindi la nostra disuguaglianza è xB < xD < yC
, il che significa B < D
dove entrambi B
e D
hanno 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.