Vous pouvez le faire en O(n)
(où n
est le nombre de chiffres) comme ceci:
En partant de la droite, vous trouvez la première paire de chiffres telle que le chiffre de gauche est plus petit que le chiffre de droite. Faisons référence au chiffre de gauche par "digit-x". Trouvez le plus petit nombre supérieur à digit-x à droite de digit-x et placez-le immédiatement à gauche de digit-x. Enfin, triez les chiffres restants dans l'ordre croissant - car ils étaient déjà dans l' ordre décroissant , tout ce que vous avez à faire est de les inverser (sauf pour digit-x, qui peut être placé au bon endroit dans O(n)
) .
Un exemple rendra cela plus clair:
123456784987654321
commencer par un nombre
123456784 987654321
^ la première place à partir de la droite où le chiffre de gauche est inférieur à la droite
Le chiffre "x" est 4
123456784 987654321
^ trouver le plus petit chiffre supérieur à 4 à droite
123456785 4 98764321
^ placez-le à gauche de 4
123456785 4 12346789
123456785123446789
^ triez les chiffres à droite de 5. Puisque tous sauf
les «4» étaient déjà en ordre décroissant, tout ce que nous devons faire est
inversez leur ordre et trouvez le bon endroit pour le '4'
Preuve de correction:
Utilisons les majuscules pour définir les chaînes de chiffres et les minuscules pour les chiffres. La syntaxe AB
signifie "la concaténation des chaînes A
et B
" . <
est un ordre lexicographique, qui est identique à un ordre entier lorsque les chaînes de chiffres sont de longueur égale.
Notre numéro d'origine N est de la forme AxB
, où x
est un seul chiffre et B
est trié décroissant.
Le nombre trouvé par notre algorithme est AyC
, où y ∈ B
est le plus petit chiffre > x
(il doit exister en raison de la manière x
choisie, voir ci-dessus) , et C
est trié croissant.
Supposons qu'il existe un certain nombre (en utilisant les mêmes chiffres) N'
tel que AxB < N' < AyC
. N'
doit commencer par A
ou sinon il ne pourrait pas tomber entre eux, donc nous pouvons l'écrire dans le formulaire AzD
. Maintenant, notre inégalité est AxB < AzD < AyC
, ce qui équivaut à l' xB < zD < yC
endroit où les trois chaînes de chiffres contiennent les mêmes chiffres.
Pour que cela soit vrai, nous devons avoir x <= z <= y
. Puisque y
c'est le plus petit chiffre > x
, z
ne peut pas être entre eux, donc soit z = x
ou z = y
. Dis z = x
. Ensuite, notre inégalité est xB < xD < yC
, ce qui signifie B < D
où les deux B
et D
ont les mêmes chiffres. Cependant, B est trié décroissant, il n'y a donc pas de chaîne avec ces chiffres plus grands que lui. Nous ne pouvons donc pas avoir B < D
. En suivant les mêmes étapes, nous voyons que si z = y
, nous ne pouvons pas avoir D < C
.
Par conséquent, N'
il ne peut pas exister, ce qui signifie que notre algorithme trouve correctement le prochain plus grand nombre.