Задано положительное целое число (в виде массива цифр). Нам разрешено менять одну пару цифр в заданном числе. Нам нужно вернуть наименьшее возможное целое число, которое можно получить. Обратите внимание, что это должно быть допустимое целое число, то есть не должно содержать ведущих 0.
Например: -
- 93561 возвращает 13569
- 596 возвращает 569
- 10234 возвращает 10234
- 120 возвращает 102
- 10091 возвращает 10019
- 98761111 возвращает 18761119
Существует ли алгоритм O(n)
для этой проблемы. Я подумал о нескольких способах для этого: -
- Найдите мин. (
minDIgit
) в заданном целое число (кроме 0) и заменить его на MSB, еслиMSB != minDigit
. ЕслиMSB==minDigit
, найдите следующую мин. цифра и обменять ее с наиболее значимой, но 1 цифрой и так далее. Это может бытьO(n^2)
в худшем случае. - Сделайте
array/vector
ofstd::pair
цифры и индекса и отсортируйте его в порядке возрастания (в соответствии с цифровыми значениями, сначала сохраните нижние индексы для соответствия значений цифр). Итерации через отсортированный массив. Поменяйте MSB на первую цифру. Если младшая цифра имеет соответствующий индекс в качестве MSB, тогда поменяйте MSB, но 1 место со следующей минимальной цифрой. Если следующая минимальная цифра имеет соответствующий индекс MSB, но 1 место, тогда замените MSB, но 2 место с этим следующим мин. цифр и т.д. Это должно бытьO(nlog(n))
.
Может кто-то предложить лучший алгоритм.
ОБНОВЛЕНИЕ 1:
Немного подумав, второй алгоритм, который я предложил, будет отлично работать (возможно, за исключением нескольких угловых случаев, которые могут обрабатываться отдельно). Более того, я могу сортировать пару (цифру, индекс) с помощью подсчета сортировки (в соответствии с цифрами), которая является устойчивой сортировкой в O(n)
времени. Есть ли недостаток в моих аргументах?
ОБНОВЛЕНИЕ 2:
Мой второй алгоритм будет работать (хотя с большим количеством проверок для угловых случаев и 0), а также в O(n)
время с counting sort
. Но решение, данное @GaborSch, намного проще, поэтому я действительно не буду давать правильный код для своего эго.