Você pode fazer isso O(n)
(onde n
está 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 AB
significa "a concatenação de strings A
e 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 ∈ B
está o menor dígito > x
(ele deve existir devido à maneira como x
foi 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, A
ou então não poderia ficar entre eles, para que possamos escrevê-lo no formulário AzD
. Agora, nossa desigualdade é AxB < AzD < AyC
equivalente a xB < zD < yC
onde 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
, z
não pode estar entre eles, portanto, z = x
ou z = y
. Diga z = x
. Então nossa desigualdade é xB < xD < yC
, o que significa B < D
onde ambos B
e D
tê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.