Вы можете сделать это в O(n)
(где n
число цифр) следующим образом:
Начиная справа, вы найдете первую пару цифр, такую, что левая цифра будет меньше правой цифры. Давайте обратимся к левой цифре "цифра-х". Найдите наименьшее число больше цифры-x справа от цифры-x и поместите его сразу слева от цифры-x. Наконец, сортируйте оставшиеся цифры в порядке возрастания - поскольку они уже были в порядке убывания, все, что вам нужно сделать, это перевернуть их (за исключением цифры-x, которая может быть размещена в правильном месте в O(n)
) .
Пример прояснит это:
123456784987654321
начать с числа
123456784 987654321
^ первое место справа, где левая цифра меньше правой
Цифра "х" 4
123456784 987654321
^ найдите самую маленькую цифру больше 4 справа
123456785 4 98764321
^ поместите это слева от 4
123456785 4 12346789
123456785123446789
^ Сортируйте цифры справа от 5. Так как все они, кроме
«4» были уже в порядке убывания, все, что нам нужно сделать, это
измените их порядок и найдите правильное место для «4»
Доказательство правильности:
Давайте использовать заглавные буквы для определения цифр-строк и строчные буквы для цифр. Синтаксис AB
означает «объединение строк A
и B
» . <
это лексикографический порядок, который совпадает с целочисленным порядком, когда строки цифр имеют одинаковую длину.
Наш оригинальный номер N имеет форму AxB
, где x
это одна цифра и B
сортируется по убыванию.
Число, найденное нашим алгоритмом, - это AyC
где y ∈ B
наименьшая цифра > x
(она должна существовать в зависимости от x
выбранного пути , см. Выше) и C
сортируется по возрастанию.
Предположим, что есть какое-то число (с использованием тех же цифр) N'
, что AxB < N' < AyC
. N'
должен начинаться с, A
иначе он не может попасть между ними, поэтому мы можем записать это в форме AzD
. Теперь наше неравенство AxB < AzD < AyC
равнозначно тому, что xB < zD < yC
все три строки цифр содержат одинаковые цифры.
Для того чтобы это было правдой, мы должны иметь x <= z <= y
. Поскольку y
это самая маленькая цифра > x
, z
не может быть между ними, так что либо z = x
или z = y
. Say z = x
. Тогда наше неравенство есть xB < xD < yC
, что означает, B < D
где оба B
и D
имеют одинаковые цифры. Однако, В отсортированный по убыванию, так что не не строка с этих цифр больше , чем это. Таким образом, мы не можем иметь B < D
. Следуя тем же шагам, мы видим, что если z = y
не можем D < C
.
Следовательно, N'
не может существовать, что означает, что наш алгоритм правильно находит следующее наибольшее число.