Kalıp #12
Aralıklar
TemelBaşlangıç veya bitişe göre sırala; sonra birleştir, ekle veya örtüşmeleri kaldır.
Ne zaman kullanılır
Problem [start, end] aralıkları verip birleştirme, kapsama, min silme veya oda sayısı istiyorsa.
Tanıma ipuçları
- Aralıkları birleştir / aralık ekle
- Toplantı odaları / min ok
- Başlangıca veya bitişe göre sırala
Yaygın tuzaklar
- Dahil vs hariç bitişler
- İspat için yanlış anahtara göre sıralama (bitiş vs başlangıç)
- Boş veya tek aralık girdilerini ele almama
90 saniyelik tanıma egzersizi
Hangisi en iyi uyuyor?
- Aralıkları birleştir / aralık ekle
- Toplantı odaları / min ok
- Başlangıca veya bitişe göre sırala
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
Unsorted intervals. Sort by start first.
Nasıl düşünülür
Sıralama düzen yaratır. Sonra doğrusal tarama örtüşen aralıkları birleştirir veya greedy kural uygular (ör. her zaman en erken biteni tut). Çizgide çizmek örtüşmeleri netleştirir.
Şablon şekilleri
| Şekil | Temel hamle | Notlar |
|---|---|---|
| Birleştir | Başlangıca göre sırala | Örtüşünce bitişi uzat |
| Min oda | Başlangıç/bitiş olay tarama | Aktif sayacı izle |
| Min silme | Bitişe göre sırala | Greedy en erken bitiş |
Karmaşıklık temeli
Sıralama O(n log n), sonra tarama O(n). Çıktı veya sıralama için O(n) alan.
Şablondan probleme
- Aralıkları normalize et (start ≤ end).
- İspatın istediği anahtara göre sırala (birleştir için start, greedy tut için end).
- Bir kez tara; açık aralık veya aktif sayacı koru.
- Birleşmiş listeyi üret veya çakışmaları say.
Şablon
TypeScript, Python ve C#’te aynı iskelet. Değişmezi uyarla; yapıyı koru.
Aralıklar · Şablon
/** Intervals template: merge overlapping ranges after sorting by start. */
export function merge(intervals: number[][]): number[][] {
if (!intervals.length) return [];
intervals = [...intervals].sort((a, b) => a[0]! - b[0]!);
const out: number[][] = [[...intervals[0]!]];
for (let i = 1; i < intervals.length; i++) {
const cur = intervals[i]!;
const last = out[out.length - 1]!;
if (cur[0]! <= last[1]!) last[1] = Math.max(last[1]!, cur[1]!);
else out.push([...cur]);
}
return out;
}
/** Intervals template: merge overlapping ranges after sorting by start. */
export function merge(intervals: number[][]): number[][] {
if (!intervals.length) return [];
intervals = [...intervals].sort((a, b) => a[0]! - b[0]!);
const out: number[][] = [[...intervals[0]!]];
for (let i = 1; i < intervals.length; i++) {
const cur = intervals[i]!;
const last = out[out.length - 1]!;
if (cur[0]! <= last[1]!) last[1] = Math.max(last[1]!, cur[1]!);
else out.push([...cur]);
}
return out;
}
#DurumProblemTürZorlukBitti
- 1#56 Merge IntervalsRehbermedium
- 2#57 Insert IntervalRehbermedium
- 3#252 Meeting RoomsRehbereasy
- 4#253 Meeting Rooms IIRehbermedium
- 5#435 Non-overlapping IntervalsRehbermedium
- 6#986 Interval List IntersectionsRehbermedium