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

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

Дан массив arr[] , состоящий из N целых чисел. Задача состоит в том, чтобы найти минимальное количество разбиений элементов массива на подмассивы, при котором перестановка порядка подмассивов сортирует заданный массив.

Примеры:

Input: arr[] = {6, 3, 4, 2, 1}
Output: 4
Explanation:
The given array can be divided into 4 subarrays as {6}, {3, 4}, {2}, {1} and these subarrays can be rearranged as {1}, {2}, {3, 4}, {6}. The resulting array will be {1, 2, 3, 4, 6} which is sorted. So, the minimum subarrays the given array can be divided to sort the array is 4.

Input: arr[] = {1, -4, 0, -2}
Output: 4

Подход: Данную проблему можно решить, поддерживая отсортированную версию массива arr[] и группируя вместе все целые числа в исходном массиве, которые появляются в той же последовательности, что и в отсортированном массиве. Ниже приведены шаги:

  • Поддерживать вектор пары V , который хранит значение текущего элемента и индекс текущего элемента массива arr[] для всех элементов в данном массиве.
  • Отсортируйте вектор V .
  • Инициализируйте переменную, скажем, cnt как 1 , которая хранит минимальное количество требуемых подмассивов.
  • Пройдите вектор V для i в диапазоне [1, N – 1] и выполните следующие шаги:
    • Если индекс i -го элемента в исходном массиве равен (1 + индекс (i – 1) -го элемента) в исходном массиве, то их можно сгруппировать вместе в одном подмассиве.
    • В противном случае два элемента должны находиться в отдельных подмассивах и увеличивать значение cnt на 1 .
  • После выполнения вышеуказанных шагов выведите значение cnt как результат возможного разбиения подмассивов.

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

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