Куча – это особый тип двоичного дерева, который соответствует следующим критериям:
- Является полным бинарным деревом;
- Значение каждого узла должно быть не больше (или не меньше) значения его дочерних узлов.
Куча имеет следующие свойства:
- Вставка элемента в кучу имеет временную сложность
O(logN)
; - Удаление элемента из кучи имеет временную сложность
O(logN)
; - Максимальное/минимальное значение в куче можно получить с временной сложностью
O(1)
.
Тип кучи
- Максимальная куча: каждый узел в куче имеет значение не меньше его дочерних узлов. Следовательно, верхний элемент (корневой узел) имеет наибольшее значение в куче.
- Минимальная куча: каждый узел в куче имеет значение не больше, чем его дочерние узлы. Таким образом, верхний элемент (корневой узел) имеет наименьшее значение в куче.
Реализация кучи в JavaScript
Далее мы реализуем кучу. конструктор возьмет компаратор, который определит порядок элементов в куче (минимум или максимум)
Концепции:
Следите за комментариями в коде.
Код:
Выход:
Максимальная куча:
[ 6, 5, 5, 4, 3, 3, 2, 2, 1 ]
Минимальная куча
[ 1, 2, 2, 3, 3, 4, 5, 5, 6 ]
Вы можете видеть, что все возвращаемые данные находятся в порядке приоритета.
Практические вопросы
Задача: K-й самый большой элемент в массиве
Учитывая массив целых чисел nums
и целое число k
, вернуть самый большой kth
элемент в массиве.
Обратите внимание, что это kth
самый большой элемент в отсортированном порядке, а не kth
отдельный элемент.
Вы должны решить ее за O(n)
временную сложность.
Пример 1:
Input: nums = [3,2,1,5,6,4], k = 2 Output: 5
Пример 2:
Input: nums = [3,2,3,1,2,4,5,5,6], k = 4 Output: 4
Решение
const findKthLargest = function(nums, k) { const heap = new MaxHeap(); nums.forEach(num => heap.push(num)); for(let i = 0;i< k-1;i++){ heap.pop(); } return heap.pop(); };