Ви можете зробити це 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'існувати не може, а це означає, що наш алгоритм правильно знаходить наступне найбільше число.