İçeriğe atla
ΣDSA Patterns
Menü
Dil

Kalıp #12

Aralıklar

Temel

Baş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
[1,3]
[8,10]
[2,6]
[15,18]

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

  1. Aralıkları normalize et (start ≤ end).
  2. İspatın istediği anahtara göre sırala (birleştir için start, greedy tut için end).
  3. Bir kez tara; açık aralık veya aktif sayacı koru.
  4. 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ürBitti
  1. 1#56 Merge IntervalsRehber
  2. 2#57 Insert IntervalRehber
  3. 3#252 Meeting RoomsRehber
  4. 4#253 Meeting Rooms IIRehber
  5. 5#435 Non-overlapping IntervalsRehber
  6. 6#986 Interval List IntersectionsRehber