Heap & Priority Queue (Куча)
Когда применять:
- Найти K самых больших/маленьких элементов (Top K).
- Слияние K отсортированных списков.
- Медиана потока данных.
- Планирование задач (всегда брать самую приоритетную).
Примечание: В JS нет встроенной PriorityQueue. На собеседованиях для K < N часто используют сортировку или QuickSelect. Для полноценного решения нужен класс MinHeap.
Top K Frequent Elements (Bucket Sort Approach)
Оптимальный способ для этой задачи за O(N), без кучи.
var topKFrequent = function(nums, k) {
const count = new Map();
// 1. Считаем частоты
for (const n of nums) count.set(n, (count.get(n) || 0) + 1);
// 2. Бакеты: index = frequency, value = array of numbers
const freq = Array.from({length: nums.length + 1}, () => []);
for (const [n, c] of count) freq[c].push(n);
// 3. Собираем топ K с конца (самые частые)
const res = [];
for (let i = freq.length - 1; i > 0; i--) {
for (const n of freq[i]) {
res.push(n);
if (res.length === k) return res;
}
}
};Практика
- Задачи LeetCode — раздел Top K / очередь с приоритетом
- heap