K-й наименьший элемент в отсортированном массиве, сформированном путем реверсирования подмассивов из случайного индекса

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

Учитывая отсортированный массив arr[] размера N и целое число K , задача состоит в том, чтобы найти K наименьший элемент, присутствующий в массиве. Данный массив получен путем перестановки подмассивов {arr[0], arr[R]} и {arr[R + 1], arr[N – 1]} по некоторому случайному индексу R. Если ключ отсутствует в массиве массив, напечатать -1 .

Примеры:

Input: arr[] = { 4, 3, 2, 1, 8, 7, 6, 5 }, K = 2
Output: 2
Explanation: Sorted form of the array arr[] is { 1, 2, 3, 4, 5, 6, 7, 8 }. Therefore, the 2nd smallest element in the array arr[] is 2.

Input: arr[] = { 10, 8, 6, 5, 2, 1, 13, 12 }, K = 3
Output: 5

Наивный подход: самый простой подход к решению проблемы — отсортировать заданный массив arr[] в порядке возрастания и вывести K наименьший элемент в массиве.

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

Альтернативный подход к приведенному выше решению: мы можем отсортировать массив без использования какой-либо техники сортировки, что, несомненно, уменьшит временную сложность. Мы можем просто найти опорную точку P в массиве (вокруг которой происходит вращение) с помощью бинарного поиска и просто перевернуть два подмассива [0, P + 1] и [P + 1, N] с помощью функции std::reverse() в С++.

Реверсирование подмассивов: после нахождения точки поворота P просто найдите реверс двух подмассивов следующим образом:

std::reverse(обр, обр + P + 1);

std::reverse(обр + P + 1, обр + N);

Таким образом, мы получаем отсортированный массив и можем вывести K -й наименьший элемент как arr[K-1] .

Временная сложность: O(N)

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

Эффективный подход: оптимальная идея основана на наблюдении, что элемент R является наименьшим элементом, поскольку элементы в диапазоне [1, R] перевернуты. Теперь, если случайным индексом является R , это означает, что подмассив [1, R] и [R + 1, N] отсортированы в порядке убывания. Поэтому задача S сводится к нахождению значения R , которое можно получить с помощью бинарного поиска. Наконец, выведите K наименьший элемент.

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

  • Инициализируйте l как 1 и h как N , чтобы сохранить индекс граничных элементов пространства поиска для бинарного поиска.
  • Цикл, пока значение l+1 < h
    • Сохраните средний элемент в переменной mid как (l+h)/2 .
    • Если обр[л] ≥ обр[середина]. Если это правда, проверьте правую часть от mid , обновив l до mid .
    • В противном случае обновите r до mid .
  • Теперь, после нахождения R , если K ≤ R , то ответ будет arr[R-K+1]. В противном случае arr[N-(KR)+1] .

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

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