Puede hacerlo en O(n)
(donde n
está el número de dígitos) así:
Comenzando por la derecha, encontrará el primer par de dígitos de modo que el dígito izquierdo sea más pequeño que el dígito derecho. Vamos a referirnos al dígito izquierdo por "dígito-x". Encuentre el número más pequeño más grande que digit-x a la derecha de digit-x, y colóquelo inmediatamente a la izquierda de digit-x. Finalmente, clasifique los dígitos restantes en orden ascendente, ya que ya estaban en orden descendente , todo lo que necesita hacer es invertirlos (guarde para el dígito-x, que se puede colocar en el lugar correcto O(n)
) .
Un ejemplo lo aclarará más:
123456784987654321
comenzar con un número
123456784 987654321
^ el primer lugar desde la derecha donde el dígito izquierdo es menor que el derecho
El dígito "x" es 4
123456784 987654321
^ encuentre el dígito más pequeño más grande que 4 a la derecha
123456785 4 98764321
^ colóquelo a la izquierda de 4
123456785 4 12346789
123456785123446789
^ ordene los dígitos a la derecha de 5. Ya que todos excepto
los '4' ya estaban en orden descendente, todo lo que tenemos que hacer es
invierta su orden y encuentre el lugar correcto para el '4'
Prueba de corrección:
Usemos letras mayúsculas para definir cadenas de dígitos y minúsculas para los dígitos. La sintaxis AB
significa "la concatenación de cadenas A
y B
" . <
es el ordenamiento lexicográfico, que es lo mismo que el ordenamiento de enteros cuando las cadenas de dígitos son de igual longitud.
Nuestro número original N es de la forma AxB
, donde x
es un solo dígito y B
se ordena descendente.
El número encontrado por nuestro algoritmo es AyC
, donde y ∈ B
es el dígito más pequeño > x
(debe existir debido a la forma en que x
se eligió, ver arriba) , y C
se ordena de forma ascendente.
Suponga que hay algún número (usando los mismos dígitos) N'
tal que AxB < N' < AyC
. N'
debe comenzar con A
o de lo contrario no podría caer entre ellos, para que podamos escribirlo en el formulario AzD
. Ahora nuestra desigualdad es AxB < AzD < AyC
, que es equivalente a xB < zD < yC
donde las cadenas de tres dígitos contienen los mismos dígitos.
Para que eso sea cierto, debemos tenerlo x <= z <= y
. Puesto que y
es el dígito más pequeño > x
, z
no puede ser de entre ellos, así que o z = x
o z = y
. Decir z = x
. Entonces nuestra desigualdad es xB < xD < yC
, lo que significa B < D
que tanto B
y D
tienen los mismos dígitos. Sin embargo, B se ordena descendente, por lo que no hay una cadena con esos dígitos más grandes que ella. Por lo tanto no podemos tener B < D
. Siguiendo los mismos pasos, vemos que si z = y
, no podemos tener D < C
.
Por N'
lo tanto , no puede existir, lo que significa que nuestro algoritmo encuentra correctamente el siguiente número más grande.