Вы можете использовать Дерево интервалов .Поместите интервалы в структуру данных.
Начните с a = 1.
На каждом шаге запрашивайте дерево для интервала, который перекрывает a и имеет самый большой правый конец.Заметьте, что когда вы реализуете дерево интервалов как расширенное красно-черное дерево, вы можете сделать так, чтобы запрос дал вам оба эти условия.
Сбросить значение a в значение этого правого конца.
Повторять, пока запрос возвращает результат, и каждый раз сохранять полученный интервал в списке, который станет ответом.Остановитесь, когда a> = n.
Вернуть полученный список.
Доказательство того, что приведенный выше результат имеет минимальную мощность
Предположим, чтопоследовательность интервалов, упорядоченных по их левым концам, полученная выше, равна I1, I2, ..., Im, и вызовите a1, a2, ..., am, их правые концы.
Если J1, J2,..., Jr были другой последовательностью интервалов, упорядоченных по их левым концам, покрывающим [1, n] с r минимумом.Назовите b1, b2, ..., br, их права заканчиваются.
Обратите внимание, что J1 покрывает 1. Следовательно, b1 <= a1 по построению I1.Следовательно, J2 перекрывает I1.Если бы J2 были внутри I1, то последовательность J можно было бы сократить, заменив J1 и J2 на I1.Это противоречит тому, что последовательность J имеет минимальную длину.</p>
Следовательно, J2 охватывает a1.Вы можете видеть, куда это идет.Теперь повторим приведенный выше аргумент.По построению b2 <= a2.Поэтому J3 перекрывает b2.Если бы J3 были внутри I1 объединения I2, то последовательность J можно было бы сделать короче, заменив J1, J2, J3 на I1, I2, что противоречит минимальному значению r.Следовательно, J3 покрывает a3.Повторите, и в итоге вы получите это г = м. </p>