Você pode fazer isso O(n)(onde nestá o número de dígitos) assim:
Começando pela direita, você encontra o primeiro par de dígitos, de modo que o dígito esquerdo seja menor que o dígito direito. Vamos nos referir ao dígito esquerdo por "dígito-x". Encontre o menor número maior que o dígito x à direita do dígito x e coloque-o imediatamente à esquerda do dígito x. Por fim, classifique os dígitos restantes em ordem crescente - como eles já estavam em ordem decrescente , tudo o que você precisa fazer é revertê-los (exceto o dígito x, que pode ser colocado no local correto em O(n)) .
Um exemplo tornará isso mais claro:
123456784987654321
comece com um número
123456784 987654321
^ o primeiro lugar da direita, onde o dígito esquerdo é menor que o direito
O dígito "x" é 4
123456784 987654321
^ encontre o menor dígito maior que 4 à direita
123456785 4 98764321
^ coloque-o à esquerda de 4
123456785 4 12346789
123456785123446789
^ classifique os dígitos à direita de 5. Como todos eles, exceto
os '4' já estavam em ordem decrescente, tudo o que precisamos fazer é
inverter a ordem e encontrar o local correto para o '4'
Prova de correção:
Vamos usar letras maiúsculas para definir cadeias de dígitos e letras minúsculas para dígitos. A sintaxe ABsignifica "a concatenação de strings Ae B" . <é uma ordem lexicográfica, que é igual à ordem inteira quando as cadeias de dígitos têm o mesmo comprimento.
Nosso número original N é do formato AxB, onde xé um único dígito e Bé classificado em ordem decrescente.
O número encontrado por nosso algoritmo é AyC, onde y ∈ Bestá o menor dígito > x (ele deve existir devido à maneira como xfoi escolhido, veja acima) e Cé classificado em ordem crescente.
Suponha que exista um número (usando os mesmos dígitos) N'tal que AxB < N' < AyC. N'deve começar com, Aou então não poderia ficar entre eles, para que possamos escrevê-lo no formulário AzD. Agora, nossa desigualdade é AxB < AzD < AyCequivalente a xB < zD < yConde todas as três cadeias de dígitos contêm os mesmos dígitos.
Para que isso seja verdade, devemos ter x <= z <= y. Dado que yé o dígito mais pequeno > x, znão pode estar entre eles, portanto, z = xou z = y. Diga z = x. Então nossa desigualdade é xB < xD < yC, o que significa B < Donde ambos Be Dtêm os mesmos dígitos. No entanto, B é descendente ordenada, por isso não é nenhuma corda com esses dígitos maiores do que ele. Assim, não podemos ter B < D. Seguindo os mesmos passos, vemos que z = y, se não podemos ter D < C.
Portanto, N'não pode existir, o que significa que nosso algoritmo encontra corretamente o próximo maior número.