Puede hacerlo en O(n)(donde nestá 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 ABsignifica "la concatenación de cadenas Ay 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 xes un solo dígito y Bse ordena descendente.
El número encontrado por nuestro algoritmo es AyC, donde y ∈ Bes el dígito más pequeño > x (debe existir debido a la forma en que xse eligió, ver arriba) , y Cse 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 Ao 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 < yCdonde las cadenas de tres dígitos contienen los mismos dígitos.
Para que eso sea cierto, debemos tenerlo x <= z <= y. Puesto que yes el dígito más pequeño > x, zno puede ser de entre ellos, así que o z = xo z = y. Decir z = x. Entonces nuestra desigualdad es xB < xD < yC, lo que significa B < Dque tanto By Dtienen 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.