Kalıp #13
Heap ve Top K
TemelTekrarlayan extract-min/max veya akış altında K en iyiyi koru.
Ne zaman kullanılır
Her seferinde tam sıralamadan en küçük, en büyük veya K en sık eleman gerektiğinde.
Tanıma ipuçları
- K. en büyük / top K sık
- K sıralı listeyi birleştir
- Akıştan medyan (iki heap)
Yaygın tuzaklar
- Top-K için min-heap vs max-heap karışıklığı
- (freq, key) çifti gerekirken yalnızca değer saklamak
- O(n log k) heap yeterken O(n log n) sıralama
90 saniyelik tanıma egzersizi
Hangisi en iyi uyuyor?
- K. en büyük / top K sık
- K sıralı listeyi birleştir
- Akıştan medyan (iki heap)
Interactive
Zihinsel model
Değişmezin tam adım adım anlatımı. Duraklat, noktalara tıkla veya ← → kullan. Her adımı kendi cümlelerinle anlatmayı hedefle.
Adım 1 / 8
1
1
1
2
2
3
map1→32→23→1
K = 2
Top K frequent. Count frequencies first.
Nasıl düşünülür
Heap ilgi sınırını tutar. Top K en büyük için boyut K min-heap güncel kazananları saklar; kök en zayıf kazanandır. Akışlarda iki heap alt/üst yarıyı dengeleyerek medyan verir.
Şablon şekilleri
| Şekil | Temel hamle | Notlar |
|---|---|---|
| Top K | Boyut K min-heap | Yeni daha iyiyse kökü at |
| K-yollu birleştirme | Başların min-heap’i | Aynı listeden sonrakini push |
| Medyan | Max-heap + min-heap | Boyutları dengele |
Karmaşıklık temeli
Top-K için tipik O(n log k); ekleme/pop O(log n). Alan O(k) veya O(n).
Şablondan probleme
- Netleştir: K en büyük, K en küçük veya K sık mı?
- Kökün atmaya hazır olduğun eleman olacağı heap yönelimini seç.
- Elemanları işle; uygunsa heap boyutu ≤ K kalsın.
- Heap’i cevap formatına çıkar veya dönüştür.
Şablon
TypeScript, Python ve C#’te aynı iskelet. Değişmezi uyarla; yapıyı koru.
Heap ve Top K · Şablon
/** Heap / top-K template: kth largest via min-heap of size k. */
export function findKthLargest(nums: number[], k: number): number {
const heap: number[] = [];
for (const x of nums) {
heap.push(x);
heap.sort((a, b) => a - b);
if (heap.length > k) heap.shift();
}
return heap[0]!;
}
/** Heap / top-K template: kth largest via min-heap of size k. */
export function findKthLargest(nums: number[], k: number): number {
const heap: number[] = [];
for (const x of nums) {
heap.push(x);
heap.sort((a, b) => a - b);
if (heap.length > k) heap.shift();
}
return heap[0]!;
}
#DurumProblemTürZorlukBitti
- 1#23 Merge k Sorted ListsRehberhard
- 2#215 Kth Largest Element in an ArrayRehbermedium
- 3#295 Find Median from Data StreamRehberhard
- 4#347 Top K Frequent ElementsRehbermedium
- 5#373 Find K Pairs with Smallest SumsRehbermedium
- 6#973 K Closest Points to OriginRehbermedium