Минимальное количество пар, которое необходимо выбрать, чтобы покрыть заданный диапазон

Опубликовано: 22 Сентября, 2022

Дан массив arr[] , состоящий из N пар и положительного целого числа K , задача состоит в том, чтобы выбрать минимальное количество пар, чтобы оно покрывало весь диапазон [0, K] . Если невозможно покрыть диапазон [0, K] , то выведите -1 .

Примеры :

Input: arr[] = {{0, 3}, {2, 5}, {5, 6}, {6, 8}, {6, 10}}, K = 10
Output: 4
Explanation: One of the optimal ways is to select the ranges {{0, 3}, {2, 5}, {5, 6}, {6, 10}} which covers the entire range [0, 10].

Input: arr[] = {{0, 4}, {1, 5}, {5, 6}, {8, 10}}, N = 10
Output : -1

Наивный подход: самый простой подход к решению проблемы состоит в том, чтобы сгенерировать все возможные подмножества и проверить для каждого подмножества, охватывает ли оно весь диапазон или нет.

Временная сложность: O(2 N × N)
Вспомогательное пространство: O(1)

Эффективный подход. Приведенный выше подход можно оптимизировать, отсортировав массив в порядке возрастания на основе левого элемента, а для пар с равными левыми элементами отсортируйте элементы в порядке убывания их правого элемента. Теперь выберите пары оптимально.

Выполните следующие шаги, чтобы решить проблему:

  • Отсортировать вектор пар arr[] по возрастанию левого элемента и, если левые элементы равны, то отсортировать массив по убыванию правого элемента пары.
  • Проверьте, если arr[0][0] != 0 , затем напечатайте -1 .
  • Инициализируйте переменную, скажем, R как arr[0][1] , которая хранит правую границу диапазона, и как 1 , которая хранит количество диапазонов, необходимых для охвата диапазона [0, K] .
  • Выполните итерацию в диапазоне [0, N-1], используя переменную i , и выполните следующие шаги:
    • Если R == K , завершить цикл.
    • Инициализируйте переменную, скажем, maxr как R , которая хранит максимальную правую границу, где левая граница ≤ R.
    • Выполните итерацию в диапазоне [i+1, N-1], используя переменную j , и выполните следующие шаги:
      • Если arr[j][0] ≤ R , измените значение maxr как max(maxr, arr[j][1]) .
    • Измените значение i как j-1 и значение R как maxr и увеличьте значение ans на 1.
  • Если R не равно K , то выведите -1 .
  • В противном случае выведите значение ans .

Ниже приведена реализация вышеуказанного подхода:

Временная сложность: O(NlogN)
Вспомогательное пространство: O(1)