Ви можете зробити це O(n)
(де n
кількість цифр), як це:
Починаючи праворуч, ви знаходите перші пари цифр такими, що ліва цифра менша, ніж права. Звернімося до лівої цифри за допомогою "цифра-х". Знайдіть найменше число, що перевищує цифру-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
. Скажи z = x
. Тоді наша нерівність - xB < xD < yC
це означає, B < D
де обидва B
і D
мають однакові цифри. Однак, В відсортоване по спадаючій, так що НЕ не рядки з цих цифр більше , ніж це. Таким чином, ми не можемо мати B < D
. Виконуючи ті самі кроки, ми бачимо, що якщо цього z = y
не можемо мати D < C
.
Тому N'
існувати не може, а це означає, що наш алгоритм правильно знаходить наступне найбільше число.