У меня есть последовательность целых чисел {a1,a2...an}, и я хочу разделить ее на минимальное количество "возрастающих подпоследовательностей". Например: пусть последовательность будет {10,30,20,40}, тогда ответ будет 2. В этом случае первая возрастающая последовательность будет {10,30,40}, а вторая будет {20}. Я могу сделать это, используя алгоритм O (N ^ 2), но меня особенно интересует решение O (N * log N), которое может служить цели.
Минимальное количество возрастающих подпоследовательностей
Ответы (1)
Это можно сделать с помощью простого жадного алгоритма.
Сохранить отсортированный массив подпоследовательностей, найденных до сих пор. Отсортировано в порядке убывания по значению последнего целого числа в каждой последовательности. Изначально пустой.
Получить первый еще не обработанный элемент из последовательности и найти подпоследовательность, в которой последнее целое число меньше этого элемента, но больше (или равно), чем во всех таких подпоследовательностях. Используйте здесь двоичный поиск, чтобы получить общую сложность O (N log N). Если такой подпоследовательности не найдено, добавьте новую в конец массива. Добавьте этот элемент в эту подпоследовательность. Повторяйте, пока в последовательности есть еще не обработанные элементы.