Kalıp #28
Sweep Line
ÖnerilenOlayları koordinata göre sırala; örtüşmeleri/silüeti tespit et.
Ne zaman kullanılır
Problemler doğrudaki aralıklar/dikdörtgenler içeriyorsa ve örtüşme, aktif aralık sayma veya silüet için başlangıç/bitiş olaylarını sıralı işlersen kullan.
Tanıma ipuçları
- Silüet / silüet problemleri
- Her noktada aktif aralık say
- Doğrudaki örtüşen dikdörtgenler / aralıklar
- Başlangıç ve bitiş koordinatlarında olaylar
Yaygın tuzaklar
- Olayları yanlış sıralama (başlangıç mı bitiş mi önce)
- Biten aralıkları aktif setten çıkarmamak
- Uç noktalar dahil mi değil mi off-by-one
90 saniyelik tanıma egzersizi
Hangisi en iyi uyuyor?
- Silüet / silüet problemleri
- Her noktada aktif aralık say
- Doğrudaki örtüşen dikdörtgenler / aralıklar
Etkileşimli
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.
olaylar = start +1, end −1
Toplantı odaları: aralıkları giriş/çıkış olayına çevir, soldan sağa tara.
Nasıl düşünülür
Sweep line, 2D aralık problemini 1D olay dizisine çevirir. X ekseni boyunca soldan sağa süpürülen dikey bir çizgi hayal et. Her aralık iki olaya katkıda bulunur: başlangıçta giriş, bitişte çıkış. Tüm olayları koordinata göre sırala, sırayla işle, girişte aralığı aktif sete ekle; çıkışta çıkar. “x’te kaç aralık aktif?” veya “x’te maksimum yükseklik ne?” sorusunun cevabı her olay noktasındaki aktif setin bir fonksiyonudur.
Aynı koordinattaki olaylar arasındaki sıralama önemli: aralıklar uç noktası paylaşıyorsa “bitiş” “başlangıç”tan önce mi (örtüşme yok) sonra mı (örtüşme var) gelmeli? Bunu problem başına açıkça tanımla. Silüetlerde girişte yüksekliğe göre azalan, çıkışta artan sırala ki aktif setin max’ı doğru güncellensin.
Şablon şekilleri
| Şekil | Temel hamle | Örnek |
|---|---|---|
| Toplantı odaları II | Giriş +1, çıkış -1; maks aktif say | LC 253 |
| Silüet | Aktif yükseklik seti; max değişince yayınla | LC 218 |
| Veri akışı aralıkları | Olayda ekle/birleştir; BST veya sıralı liste | LC 352 |
| Mükemmel dikdörtgen | Alan toplamı + sweep ile örtüşme kontrolü | LC 391 |
Karmaşıklık temeli
O(n log n) zaman (olay sıralama), O(n) alan (aktif set). Her olay bir kez işlenir; aktif set genelde heap veya sıralı yapıdır.
Şablondan probleme
- Her aralık/dikdörtgeni giriş ve çıkış olaylarına ayır.
- Olayları koordinata göre sırala; problemin örtüşme kuralına uyan sıralamayı seç.
- Olayları sırayla işle: aktif seti ve güncel cevabı koru.
- Cevabı aktif setten çıkar, maks sayı, maks yükseklik veya birleştirilmiş liste.
Şablon
TypeScript, Python ve C#’te aynı iskelet. Değişmezi uyarla; yapıyı koru.
/** Sweep line template: max concurrent intervals (meeting rooms II). */
export function minMeetingRooms(intervals: [number, number][]): number {
const events: [number, number][] = [];
for (const [start, end] of intervals) {
events.push([start, 1]);
events.push([end, -1]);
}
events.sort((a, b) => a[0]! - b[0]! || a[1]! - b[1]!);
let active = 0, max = 0;
for (const [, delta] of events) {
active += delta;
if (active > max) max = active;
}
return max;
}/** Sweep line template: max concurrent intervals (meeting rooms II). */
export function minMeetingRooms(intervals: [number, number][]): number {
const events: [number, number][] = [];
for (const [start, end] of intervals) {
events.push([start, 1]);
events.push([end, -1]);
}
events.sort((a, b) => a[0]! - b[0]! || a[1]! - b[1]!);
let active = 0, max = 0;
for (const [, delta] of events) {
active += delta;
if (active > max) max = active;
}
return max;
}- 1#218 The Skyline ProblemRehberhard
- 2#253 Meeting Rooms IIRehbermedium
- 3#352 Data Stream as Disjoint IntervalsRehberhard
- 4#391 Perfect RectangleRehberhard
- 5#939 Minimum Area RectangleRehbermedium
- 6#1272 Remove IntervalRehbermedium