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

Aralıklar

Rehber 3 / 6 · Yol 3 / 6

Etkileşimli

Zihinsel model

Bu problem için animasyonlu çözüm. Adımları kaydır veya boşlukla duraklat; değişmezi yüksek sesle yeniden anlat.

Adım 1 / 6
[0,30]
[5,10]
[15,20]

Bir kişi tüm toplantılara katılabilir mi? Örtüşme hayır demektir. Başlangıca göre sırala, komşu çiftleri tara.

Demo önizleme: Bu çözümler otomatik test paketini geçiyor ama insan tarafından incelenmedi. Trade-off ve yazıları taslak olarak değerlendirin.

Meeting Rooms

Problem (yeniden ifade)

Toplantı aralıkları [start, end] verildiğinde, bir kişinin hepsine katılıp katılamayacağını döndür (hiçbir iki toplantı örtüşmesin). Uç noktaların değmesi (end == next.start) izinlidir.

Sezgi

Herhangi iki toplantı örtüşüyorsa, başlangıca göre sıralama çatışmayı komşu bir çift olarak ortaya çıkarır.

Yaklaşımlar

Başlangıca göre sırala + komşu kontrolü

Doğrulanmadı
Zaman O(n log n)Alan O(1) or O(n)

Fikir. Başlangıca göre sırala. Her ardışık çift için next.start < prev.end ise çatışma vardır.

Yürüyüş. [[0,30],[5,10],[15,20]] → sıralama sonrası 5 < 30 → false. [[7,10],[2,4]] → sıralı [[2,4],[7,10]] → 7 ≥ 4 → true.

Trade-off. Darboğaz sıralama. Olaylı sweep-line da çalışır ve Meeting Rooms II’ye genellenir.

Çözüm
export function canAttendMeetings(intervals: number[][]): boolean {
  intervals = [...intervals].sort((a, b) => a[0]! - b[0]!);
  for (let i = 1; i < intervals.length; i++) {
    if (intervals[i]![0]! < intervals[i - 1]![1]!) return false;
  }
  return true;
}
export function canAttendMeetings(intervals: number[][]): boolean {
  intervals = [...intervals].sort((a, b) => a[0]! - b[0]!);
  for (let i = 1; i < intervals.length; i++) {
    if (intervals[i]![0]! < intervals[i - 1]![1]!) return false;
  }
  return true;
}

Şablon bağlantısı

Merge Intervals’ın örtüşme-tespiti kardeşi. Aynı sırala-sonra-tara iskeleti; ilk çatışmada erken çık.

Yansıma